package dal;

import bd.BoundParam;
import bd.ConexionAvw;
import bd.ParamCallable;
import bd.Procedimientos;
import java.io.InputStream;
import java.io.Reader;
import java.math.BigDecimal;
import java.net.URL;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Date;
import java.sql.NClob;
import java.sql.Ref;
import java.sql.ResultSetMetaData;
import java.sql.RowId;
import java.sql.SQLWarning;
import java.sql.SQLXML;
import java.sql.Time;
import java.sql.Timestamp;
import java.sql.Types;
import java.util.Calendar;
import negocio.ArticuloAsociado;
import oracle.jdbc.driver.OracleTypes;

import excepciones.AvwException;
import java.lang.reflect.Array;


import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;
import java.util.Map;

import java.util.logging.Level;
import java.util.logging.Logger;

import negocio.ArticuloCampania;
import negocio.ArticuloWeb;
import negocio.CampaniaWeb;
import negocio.CategoriaArticulo;
import negocio.CategoriaRubro;
import negocio.CategoriaWeb;
import negocio.DestacadoWeb;
import negocio.DocumentoArticuloWeb;
import negocio.FotoArticuloWeb;
import negocio.Marca;
import oracle.jdbc.oracore.OracleType;
import oracle.jdbc.oracore.OracleTypeSINT32;
import oracle.sql.NUMBER;

import util.Recurso;
import util.Utiles;
import static java.sql.Types.*;

public class ArticuloDAL {
    
    static final Logger logger = Utiles.iniciarLogger("ArticuloDAL", false);
    static private Recurso procedimiento = new Recurso("articulodal.properties");
    
    /**
     * Obtiene un ArrayList de todos los articulos existentes
     * Retorna todos los articulos
     * @version 1.15
     * @return Retorna todos los articulos a partir de la tabla de etercor y
     *          la de este sistema. Si el articulo no esta en las tablas del
     *          sistema, se debe retornar igual sin los datos correspondientes
     *          a la tabla del sistema.
     */
    public static ArrayList<ArticuloWeb> listarArticulos() throws AvwException {
        ArrayList<ArticuloWeb> articulosWeb = new ArrayList<ArticuloWeb>();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList<ParamCallable> params = new ArrayList<ParamCallable>();
        int pos = 0 ;
        
        
        try {
            logger.info("Listo los todos articulos con la consula");
            c.abrirConexion();
            params.add(new ParamCallable(++pos,null,OracleTypes.CURSOR,ParamCallable.OUT));
            rs = c.getCallableStatement(Procedimientos.ARTICULOS_LISTAR,params,1);
            
            
            while (rs.next()) {
                /** Crea un articulo */
                ArticuloWeb articulo =
                        new ArticuloWeb(Utiles.noNull(rs.getObject("art_codigo")),
                        Utiles.noNull(rs.getObject("art_nombre")),
                        Utiles.noNull(rs.getObject("art_costo_envio")),
                        Utiles.noNull(rs.getObject("art_descr_comercial")),
                        Utiles.noNull(rs.getObject("mar_codigo")),
                        Utiles.noNull(rs.getObject("rub_codigo")));
                articulosWeb.add(articulo);
            }
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        }finally{
            c.cerrarConexion();
        }
        
        return articulosWeb;
    }
        /**
     * Obtiene un ArrayList de los articulos existentes segun el filtro indicado.
     * opcion =
     *                 0.- Codigo o Nombre de articulo
     *                 1.- Codigo articulo
     *                 2.- Nombre articulo
     *                 3.- Descripcion comercial
     *                 4.- Nombre marca
     *                 5.- Nombre categoria
     * filtro = valor a buscar.
     * opcionCampania = si es igual a -1 no se filtra por ninguna campania,
     * de caso contrario se debe pasar el codigo de la campania.
     * Por cada articulo retorna tambien la cantidad de fotos y documentos.
     * @return Retorna los articulos a partir de la tabla de etercor y
     *          la de este sistema. Si el articulo no esta en las tablas del
     *          sistema, se debe retornar igual sin los datos correspondientes
     *          a la tabla del sistema.
     */
    public static ArrayList<ArticuloWeb> listarArticulosFiltro(int opcion, String filtro, CampaniaWeb opcionCampania) throws AvwException {
        ArrayList<ArticuloWeb> articulosWeb = new ArrayList<ArticuloWeb>();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        /*
        sql.append("SELECT DISTINCT(art.art_codigo), art.art_nombre, art.art_descr_comercial, art.cam_codigo, cw.caw_codigo, ");
        sql.append("cw.caw_nombre, art.mar_codigo, art.mar_nombre, ");
        sql.append("(SELECT COUNT(*) ");
        sql.append("FROM fotos_articulos_web faw ");
        sql.append("WHERE faw.art_codigo = art.art_codigo) cantidadfotos, ");
        sql.append("(SELECT COUNT(*) ");
        sql.append("FROM documentos_articulos_web daw ");
        sql.append("WHERE daw.art_codigo = art.art_codigo) cantidaddocumentos ");
        sql.append("FROM articulos_categorias_web acw, categorias_web cw, articulos_avw art ");
        sql.append("WHERE acw.art_codigo(+) = art.art_codigo ");
        sql.append("AND cw.caw_codigo = acw.caw_codigo ");
        */
        sql.append("SELECT DISTINCT(art.art_codigo), art.art_nombre, art.art_descr_comercial, cw.caw_codigo, ");
        sql.append("cw.caw_nombre, art.mar_codigo, art.mar_nombre, ");
        sql.append("(SELECT COUNT(*) ");
        sql.append("FROM fotos_articulos_web faw ");
        sql.append("WHERE faw.art_codigo = art.art_codigo) cantidadfotos, ");
        sql.append("(SELECT COUNT(*) ");
        sql.append("FROM documentos_articulos_web daw ");
        sql.append("WHERE daw.art_codigo = art.art_codigo) cantidaddocumentos ");
        sql.append("FROM articulos_categorias_web acw, categorias_web cw, articulos_avw art ");
        sql.append("WHERE acw.art_codigo(+) = art.art_codigo ");
        sql.append("AND cw.caw_codigo(+) = acw.caw_codigo ");
        
        /*Filtrado por campania*/
        if (!opcionCampania.getCamCodigo().equals("-1")){
            sql.append("AND art.cam_codigo = '");
            sql.append(opcionCampania.getCamCodigo());
            sql.append("' ");
        }
        
        /*opcion del filtrado*/
        switch (opcion) {
            case 0:
                sql.append("AND (art.art_codigo LIKE '%");
                sql.append(filtro.toUpperCase());
                sql.append("%'");
                sql.append("OR art.art_nombre LIKE '%");
                sql.append(filtro.toUpperCase());
                sql.append("%')");
                break;
            case 1:
                sql.append("AND art.art_codigo LIKE '%");
                sql.append(filtro.toUpperCase());
                sql.append("%'");
                break;
            case 2:
                sql.append("AND art.art_nombre LIKE '%");
                sql.append(filtro.toUpperCase());
                sql.append("%'");
                break;
            case 3:
                sql.append("AND art.art_descr_comercial LIKE '%");
                sql.append(filtro.toUpperCase());
                sql.append("%'");
                break;
            case 4:
                sql.append("AND art.mar_nombre LIKE '%");
                sql.append(filtro.toUpperCase());
                sql.append("%'");
                break;
            case 5:
                sql.append("AND cw.caw_nombre LIKE '%");
                sql.append(filtro.toUpperCase());
                sql.append("%'");
                break;
            default:
                break;
        }
        sql.append("ORDER BY art.art_nombre ");
        
        try {
            logger.info("Listo los articulos con la consula");
            logger.info(sql.toString());
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,null);
            
            while (rs.next()) {
                /* Crea un articulo */
                ArticuloWeb articulo = new ArticuloWeb();
                articulo.setArtCodigo(Utiles.noNull(rs.getObject("art_codigo")));
                articulo.setArtNombre(Utiles.noNull(rs.getObject("art_nombre")));
                articulo.setArtDescripcion(Utiles.noNull(rs.getObject("art_descr_comercial")));
                
                Marca marca = new Marca();
                // se coloca -1 para evitar el buble infinito al hacer getMar
                marca.setMarCodigo("-1");
                marca.setMarNombre("");
                if (!Utiles.noNull(rs.getObject("mar_codigo")).equals("")){
                    marca.setMarCodigo(Utiles.noNull(rs.getObject("mar_codigo")));
                    marca.setMarNombre(Utiles.noNull(rs.getObject("mar_nombre")));
                }
                articulo.setArtMarcaCodigo(marca);
                
                CategoriaWeb categoria = new CategoriaWeb();
                // se coloca -1 para evitar el buble infinito al hacer getCaw
                categoria.setCawCodigo("-1");
                categoria.setCawNombre("");
                if (!Utiles.noNull(rs.getObject("caw_codigo")).equals("")){
                    categoria.setCawCodigo(Utiles.noNull(rs.getObject("caw_codigo")));
                    categoria.setCawNombre(Utiles.noNull(rs.getObject("caw_nombre")));
                }
                articulo.setArwCategoria(categoria);
                
                ArrayList<FotoArticuloWeb> fotos = new ArrayList<FotoArticuloWeb>();
                for (int i=0; i<rs.getInt("cantidadFotos"); i++){
                    FotoArticuloWeb foto = new FotoArticuloWeb();
                    fotos.add(foto);
                }
                articulo.setArwFotos(fotos);
                
                ArrayList<DocumentoArticuloWeb> documentos = new ArrayList<DocumentoArticuloWeb>();
                for (int i=0; i<rs.getInt("cantidadDocumentos"); i++){
                    DocumentoArticuloWeb doc = new DocumentoArticuloWeb();
                    documentos.add(doc);
                }
                articulo.setArwDocmentos(documentos);
                
                articulosWeb.add(articulo);
            }   // fin while
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        }finally{
            c.cerrarConexion();
        }
        
        return articulosWeb;
    }
  
    /**
     * Obtiene un arraylist de objetos foto del articulo pasado por parametro.
     * @return array de objetos FotoArticuloWeb del articulo
     * @param articuloWeb ArticuloWeb (con el codigo).
     */
    public static ArrayList<FotoArticuloWeb> obtenerFotosDeArticulo(ArticuloWeb articuloWeb) throws AvwException {
        ArrayList<FotoArticuloWeb> alFotosArt =
                new ArrayList<FotoArticuloWeb>();
        ResultSet rs;
        ConexionAvw conexion = new ConexionAvw();
        ArrayList params = new ArrayList();
        int pos=0;
        
        try {
            logger.info("Listo las FotoArticuloWeb con la consula");
            conexion.abrirConexion();
            params.add(new ParamCallable(++pos,null,OracleTypes.CURSOR,ParamCallable.OUT));
            params.add(new ParamCallable(++pos,articuloWeb.getArtCodigo(),OracleTypes.VARCHAR,ParamCallable.IN));
            rs = conexion.getCallableStatement(Procedimientos.ARTICULOS_OBTENER_FOTOS,params,1);
            
            while (rs.next()) {
                FotoArticuloWeb fw = new FotoArticuloWeb();
                fw.setFawCodigo(Utiles.noNull(rs.getObject("faw_codigo")));
                fw.setFawDescripcion(Utiles.noNull(rs.getObject("faw_descripcion")));
                fw.setFawNivel(Integer.parseInt(Utiles.noNull(rs.getObject("faw_nivel"))));
                
                alFotosArt.add(fw);
            }
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            conexion.cerrarConexion();
        }
        
        return alFotosArt;
    }
    
    /**
     * Modifica el nivel de la foto pasada por parametro.
     **/
    public static void ModificarNivelFoto(FotoArticuloWeb fotoArticuloWeb, String artCodigo) throws AvwException {
        StringBuilder sql = new StringBuilder();
        String codigo = "";
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
        try {
            sql.setLength(0);
            sql.append("UPDATE fotos_articulos_web ");
            sql.append("SET faw_nivel = 0");
            sql.append("WHERE art_codigo = ?");
            
            al.clear();
            pos = 0;
            al.add(new BoundParam(++pos,artCodigo,VARCHAR));
            
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,al);
            
            sql.setLength(0);
            sql.append("UPDATE fotos_articulos_web ");
            sql.append("SET faw_nivel = 1");
            sql.append("WHERE faw_codigo = ?");
            
            al.clear();
            pos = 0;
            al.add(new BoundParam(++pos,fotoArticuloWeb.getFawCodigo(),VARCHAR));
            
            c.executePreparedStatement(sql,al);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }finally {
            c.cerrarConexion();
        }
    }
    
        /**
     * Modifica el titulo de los articulos asociados
     **/
    public static void ModificarArticulosAsociados(
            ArticuloAsociado articuloAsociado, CampaniaWeb campaniaWeb, 
            ArticuloWeb articuloWeb) throws AvwException {
        StringBuilder sql = new StringBuilder();
        String codigo = "";
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
        try {
            sql.setLength(0);
            sql.append("UPDATE articulos_asociados ");
            sql.append("SET aras_titulo = ? ");
            sql.append("WHERE art_codigo = ? ");
            sql.append("AND cam_codigo = ? ");
            sql.append("AND art_codigo_asociado = ?");
            sql.append("AND aras_tipo = ?");
            
            al.clear();
            pos = 0;
            al.add(new BoundParam(++pos,articuloAsociado.getArasTitulo(),VARCHAR,true));
            al.add(new BoundParam(++pos,articuloWeb.getArtCodigo(),VARCHAR,true));
            al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),VARCHAR,true));
            al.add(new BoundParam(++pos,articuloAsociado.getArasArticuloCampania().getArcArticulo().getArtCodigo(),VARCHAR,true));
            al.add(new BoundParam(++pos,articuloAsociado.getArasTipo(),VARCHAR,true));
            
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,al);
            
        } catch (SQLException ex) {
            ex.printStackTrace();
        }finally {
            c.cerrarConexion();
        }
    }
    /**
     * Modifica esMasPedido del articulo enviado por parametro.
     **/
        public static void ModificarEsMasPedidoEsMasConsultado(ArticuloCampania articuloCampania) throws AvwException {
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ArrayList al = new ArrayList();
        ConexionAvw c = new ConexionAvw();
        int pos=0;
        int esMasConsultado=0;
        if(articuloCampania.getArcEsMasConsultado()){
            esMasConsultado = 1;
        }
        int esMasPedido=0;
        if(articuloCampania.getArcEsMasPedido()){
            esMasPedido = 1;
        }
        try {
            sql.setLength(0);
            sql.append("UPDATE articulos_avw ");
            sql.append("SET art_es_mas_consultado = ?");
            sql.append(", art_es_mas_pedido = ?");
            sql.append("WHERE art_codigo = ?");
            
            al.clear();
            pos = 0;
            al.add(new BoundParam(++pos,esMasConsultado,VARCHAR));
            al.add(new BoundParam(++pos,esMasPedido,VARCHAR));
            al.add(new BoundParam(++pos,articuloCampania.getArcArticulo().getArtCodigo(),VARCHAR));
            
            c.abrirConexion();
            
            c.executePreparedStatement(sql,al);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }finally {
            c.cerrarConexion();
        }
    }    
    /**
     * Obtener los documentos del articulo
     * @return array de objetos DocumentoArticuloWeb del articulo pasado por parametro.
     * @param  articuloWeb ArticuloWeb (con el codigo).
     */
    public static ArrayList<DocumentoArticuloWeb> obtenerDocumentosDeArticulo(ArticuloWeb articuloWeb) throws AvwException {
        ArrayList<DocumentoArticuloWeb> documentos = new ArrayList();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
        
        sql.append("SELECT ");
        sql.append("daw_codigo, ");
        sql.append("daw_descripcion, ");
        sql.append("art_codigo ");
        sql.append("FROM documentos_articulos_web ");
        sql.append("WHERE art_codigo LIKE ? ");
        al.add(new BoundParam(++pos,articuloWeb.getArtCodigo(),VARCHAR));
        
        try {
            logger.info("Obtengo los documentos del articulo");
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,al);
            
            while (rs.next()) {
                DocumentoArticuloWeb documento = new DocumentoArticuloWeb();
                
                documento.setDawCodigo(Utiles.noNull(rs.getObject("daw_codigo")));
                documento.setDawDescripcion(Utiles.noNull(rs.getObject("daw_descripcion")));
                
                documentos.add(documento);
            }
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
        
        return documentos;
    }
    
    /**
     * Registra la foto
     * @param fotoArticuloWeb FotoArticuloWeb
     * @return String con el codigo de la foto registrada
     */
    public static String insertarFoto(ArticuloWeb articuloWeb,
            FotoArticuloWeb fotoArticuloWeb) throws AvwException {
        StringBuilder sql = new StringBuilder();
        String codigo = "";
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
        
        try {
            //Obtengo el codigo con el q debo insertar
            sql.append("select faw_codigo.nextval from dual");
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,null);
            
            rs.next();
            codigo = Utiles.noNull(rs.getObject(1));
            
            logger.info(sql.toString());
            
            sql.setLength(0);
            sql.append("INSERT INTO fotos_articulos_web (");
            sql.append("   faw_codigo, art_codigo, faw_descripcion, faw_nivel) ");
            sql.append("VALUES ( ? , ? , ?, ? )");
            
            pos = 0;
            al.add(new BoundParam(++pos,codigo,NUMERIC));
            al.add(new BoundParam(++pos,articuloWeb.getArtCodigo(),VARCHAR));
            al.add(new BoundParam(++pos,fotoArticuloWeb.getFawDescripcion(),VARCHAR));
            al.add(new BoundParam(++pos,0,NUMERIC));
            c.abrirConexion();
            c.executePreparedStatement(sql,al);
            
            /*
             Verifica si es la primer foto para ese articulo, si es asi
             le asigna el nivel 1.
             */
            sql.setLength(0);
            sql.append("SELECT ");
            sql.append("count(faw_codigo) cantidad ");
            sql.append("FROM fotos_articulos_web ");
            sql.append("WHERE art_codigo = ? ");
            
            al.clear();
            pos = 0;
            al.add(new BoundParam(++pos,articuloWeb.getArtCodigo(),VARCHAR));
            
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,al);
            
            if (rs.next()){
                if (rs.getInt("cantidad") == 1){
                    sql.setLength(0);
                    sql.append("UPDATE fotos_articulos_web ");
                    sql.append("SET faw_nivel = ?");
                    sql.append("WHERE faw_codigo = ?");
                    
                    al.clear();
                    pos = 0;
                    al.add(new BoundParam(++pos,1,NUMERIC));
                    al.add(new BoundParam(++pos,codigo,NUMERIC));
                    
                    c.abrirConexion();
                    c.executePreparedStatement(sql,al);
                }
            }
            c.cerrarConexion();
        } catch (Exception e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
        
        return codigo;
    }
        /**
     * Eliminar articulo asociado, a partir del codigo del objeto articuloWeb 
     * que se encuentra en ArticuloCampania que se encuentra a su vez en ArticuloAsociado
     * @param ArticuloAsociado articuloAsociado (con el tipo de asociacion y el objeto articuloCampania y su respectivo articuloWeb)
     * @param ArticuloWeb (solo el codigo) que posee articulos asociados
     * @param CampaniaWeb (solo el codigo) la campania de la cual se desea eliminar el articuloAsociado
     * 
     */
    public static void eliminarArticuloAsociado(ArticuloAsociado articuloAsociado,
            CampaniaWeb campaniaWeb, ArticuloWeb articuloWeb) throws AvwException {
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
                
        sql.append("DELETE ");
        sql.append("articulos_asociados ");
        sql.append("WHERE ");
        sql.append("art_codigo = ? ");
        sql.append("AND art_codigo_asociado = ? ");
        sql.append("AND cam_codigo = ? ");
        sql.append("AND aras_tipo = ? ");
        
        try {
            logger.info("DELETE articulos_asociados");
            al.add(new BoundParam(1,articuloWeb.getArtCodigo(),VARCHAR));
            al.add(new BoundParam(2,articuloAsociado.getArasArticuloCampania().getArcArticulo().getArtCodigo(),VARCHAR));
            al.add(new BoundParam(3,campaniaWeb.getCamCodigo(),VARCHAR));
            al.add(new BoundParam(4,articuloAsociado.getArasTipo(),VARCHAR));
            c.abrirConexion();
            c.executePreparedStatement(sql.toString(),al);
            
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
    }
    
    /**
     * Eliminar foto, a partir del codigo del objeto Foto
     * que se pasa por parametro
     * @param fotoArticuloWeb FotoArticuloWeb (solo el codigo)
     */
    public static void eliminarFoto(FotoArticuloWeb fotoArticuloWeb) throws AvwException {
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        
        sql.append("DELETE ");
        sql.append("fotos_articulos_web ");
        sql.append("WHERE ");
        sql.append("faw_codigo = ? ");
        
        try {
            logger.info("DELETE FotoArticuloWeb");
            al.add(new BoundParam(1,fotoArticuloWeb.getFawCodigo(),NUMERIC));
            c.abrirConexion();
            c.executePreparedStatement(sql.toString(),al);
            
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
    }
    
    /**
     * Guardar el documento
     * @param documentoArticuloWeb DocumentoArticuloWeb
     * @return codigo del documento registrado
     */
    public static String insertarDocumento(DocumentoArticuloWeb documentoArticuloWeb,
            ArticuloWeb articuloWeb) throws AvwException {
        StringBuilder sql = new StringBuilder();
        String codigo = "";
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        
        try {
            //Obtengo el codigo con el q debo insertar
            sql.append("select daw_codigo.nextval  from dual");
            //Abre conexion
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,null);
            
            rs.next();
            codigo = Utiles.noNull(rs.getObject(1));
            
            logger.info(sql.toString());
            
            sql.setLength(0);
            sql.append("INSERT INTO documentos_articulos_web ( ");
            sql.append("daw_codigo,daw_descripcion, art_codigo) ");
            sql.append(" VALUES(?,?,?)");
            
            al.add(new BoundParam(1,codigo,java.sql.Types.NUMERIC));
            al.add(new BoundParam(2,documentoArticuloWeb.getDawDescripcion(),java.sql.Types.VARCHAR));
            al.add(new BoundParam(3,articuloWeb.getArtCodigo(),java.sql.Types.VARCHAR));
            c.executePreparedStatement(sql,al);
            
        } catch (Exception e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
        
        return codigo;
    }
    
        /**
     * Guardar los articulosAsociados 
     * @param ArticuloWeb con solo el codigo del articulo al que se le quiere asociar
     * articulos.
     * @param ArrayList de articulosasociado que se quieren asociar
     * @param CampaniaWeb con solo el codigo de la campania en la cual se realiza la 
     * asociacion
     * @param int tipo para saber si es un articulo relacionado o un articulo similar
     *  (0 = si es un articulo relacionado)
     *  (1 = si es un articulo similar)
     */
    public static void insertarArticuloAsociado(
            ArrayList<ArticuloAsociado> articulos, ArticuloWeb articulo, 
            CampaniaWeb campaniaWeb) throws AvwException {
        StringBuilder sql = new StringBuilder();
        String codigo = "";
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        
        try {
            c.abrirConexion();
            for(ArticuloAsociado articuloAsociado : articulos){
                sql.setLength(0);
                sql.append("DELETE articulos_asociados ");
                sql.append("WHERE art_codigo_asociado = ? " );
                sql.append("AND art_codigo = ? AND cam_codigo = ? ");
                sql.append("AND aras_tipo = ? ");
                al.clear();
                al.add(new BoundParam(1,articuloAsociado.getArasArticuloCampania().getArcArticulo().getArtCodigo(),java.sql.Types.VARCHAR));
                al.add(new BoundParam(2,articulo.getArtCodigo(),java.sql.Types.VARCHAR));
                al.add(new BoundParam(3,campaniaWeb.getCamCodigo(),java.sql.Types.VARCHAR));
                al.add(new BoundParam(4,articuloAsociado.getArasTipo(),java.sql.Types.VARCHAR));
                c.executePreparedStatement(sql,al);
            }
            for(ArticuloAsociado articuloAsociado : articulos){
                sql.setLength(0);
                sql.append("INSERT INTO articulos_asociados ( ");
                sql.append("art_codigo,art_codigo_asociado, cam_codigo, ");
                sql.append("aras_titulo, aras_tipo) ");
                sql.append(" VALUES(?,?,?,?,?)");

                al.add(new BoundParam(1,articulo.getArtCodigo(),java.sql.Types.VARCHAR));
                al.add(new BoundParam(2,articuloAsociado.getArasArticuloCampania().getArcArticulo().getArtCodigo(),java.sql.Types.VARCHAR));
                al.add(new BoundParam(3,campaniaWeb.getCamCodigo(),java.sql.Types.VARCHAR));
                al.add(new BoundParam(4,articuloAsociado.getArasTitulo(),java.sql.Types.VARCHAR));
                al.add(new BoundParam(5,articuloAsociado.getArasTipo(),java.sql.Types.VARCHAR));
                c.executePreparedStatement(sql,al);
            }
            
        } catch (Exception e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
    }
    
    /**
     * Eliminar foto, a partir del codigo del objeto que
     * se pasa por parametro.
     * @param documentoArticuloWeb DocumetnoArticuloWeb (solo el codigo)
     * @version Revisado el acceso a datos..
     */
    public static void eliminarDocumento(DocumentoArticuloWeb documentoArticuloWeb) throws AvwException {
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        
        sql.append("DELETE documentos_articulos_web ");
        sql.append("WHERE ");
        sql.append("daw_codigo = ? ");
        
        try {
            logger.info("Elimina el documento");
            al.add(new BoundParam(1,documentoArticuloWeb.getDawCodigo(),java.sql.Types.NUMERIC));
            c.abrirConexion();
            c.executePreparedStatement(sql.toString(),al);
            
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
    }
    
    /**
     * Modificar el articulo
     * @param articuloWeb ArticuloWeb (con
     * el objeto CategoriaWeb y las palabras claves)
     */
    public static void modificarArticulo(ArticuloWeb articuloWeb) throws AvwException {
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
        
        try {
            sql.append("UPDATE ");
            sql.append("articulos_categorias_web SET ");
            sql.append("caw_codigo = ?,");
            sql.append("acw_palabras_claves = ? ");
            sql.append("WHERE ");
            sql.append("art_codigo = ? ");
            
            al.add(new BoundParam(++pos,articuloWeb.getArwCategoria().getCawCodigo(),VARCHAR));
            al.add(new BoundParam(++pos,articuloWeb.getArwPalabrasClaves(),VARCHAR));
            al.add(new BoundParam(++pos,articuloWeb.getArtCodigo(),VARCHAR));
            
            c.abrirConexion();
            logger.info("UPDATE Articulo");
            logger.info(sql.toString());
            c.executePreparedStatement(sql,al);
            
            
        } catch (Exception e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
    }
    
    /**
     * Lista de los articulos de una campania, de una categoria
     * y pudiendo filtrar por algunos datos del articulo (nombre).
     * @param objeto CampaniaWeb
     * @param objeto ArticuloWeb
     * @param objeto CategoriaWeb
     * @return array de objetos ArticuloWeb que pertenecen a la categoria
     * y a la articulo pasada por parametro.
     */
    public static ArrayList<ArticuloCampania> listarArticulosPorCategoriaFiltro(CampaniaWeb campaniaWeb,
            ArticuloWeb articuloWeb,
            CategoriaWeb categoriaWeb) throws AvwException {
        
        ArrayList<ArticuloCampania> articulos =
                new ArrayList<ArticuloCampania>();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
        
        sql.append("SELECT acv.acw_consulta, acv.acw_pedido, acv.lpad_precio, acv.lpal_precio, ");
        sql.append("acv.art_codigo, acv.art_nombre, acv.art_costo_envio, acv.rub_codigo, ");
        sql.append("acv.art_descr_comercial, acv.acw_palabras_claves, acv.mar_codigo, acv.mar_nombre ");
        sql.append("FROM articulos_campanias_vista acv ");
        sql.append("WHERE acv.cam_codigo LIKE ? ");
        al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),VARCHAR));
        
        if (categoriaWeb.getCawCodigo().equals("-1")) {
            sql.append("AND acv.caw_codigo = ? ");
            al.add(new BoundParam(++pos,categoriaWeb.getCawCodigo(),NUMERIC));
        }
        
        sql.append("AND acv.art_nombre LIKE ?");
        al.add(new BoundParam(++pos,"%"+articuloWeb.getArtCodigo() + "%",VARCHAR));
        
        try {
            logger.info("Consulto los articulos");
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,al);
            
            while (rs.next()) {
                
                
                ArticuloCampania ac = new ArticuloCampania();
                ArticuloWeb aw = new ArticuloWeb();
                
                aw.setArtCodigo(Utiles.noNull(rs.getObject("a.art_codigo")));
                aw.setArtNombre(Utiles.noNull(rs.getObject("a.art_nombre")));
                aw.setArtCostoEnvio(Float.parseFloat(Utiles.noNull(rs.getObject("art_costo_envio"),
                        "0")));
                aw.setArtRubro(Utiles.noNull(rs.getObject("a.rub_codigo")));
                aw.setArtDescripcion(Utiles.noNull(rs.getObject("a.art_descr_comercial")));
                aw.setArwPalabrasClaves(Utiles.noNull(rs.getObject("acw.acw_palabras_claves")));
                aw.setArtMarcaCodigo(new Marca(Utiles.noNull(rs.getObject("mar_codigo")),
                        Utiles.noNull(rs.getObject("mar_nombre"))));
                
                ac.setArcArticulo(aw);
                ac.setArcConsulta(Integer.valueOf(Utiles.noNull(rs.getObject("ac.acw_consulta"),
                        "0")));
                ac.setArcPedido(Integer.valueOf(Utiles.noNull(rs.getObject("ac.acw_pedido"),
                        "0")));
                ac.setArcPrecioDescuento(Float.parseFloat(Utiles.noNull(rs.getObject("LPAD_precio"),
                        "0")));
                ac.setArcPrecioLista(Float.parseFloat(Utiles.noNull(rs.getObject("lpal_precio"),
                        "0")));
                articulos.add(ac);
            }
        } catch (SQLException e) {
            // TODO
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
        
        return articulos;
    }
    
    /**
     * Verificar si existen articulos destacados para la campania y la categoria
     * pasada por parametro.
     * @param campaniaWeb objeto CampaniaWeb con solo el codigo
     * @param categoriaWeb objeto CategoriaWeb con solo el codigo
     * @return true en el caso de que hay articulos destacados y false en caso
     * contrario
     */
    public static Boolean hayArticuloCampaniaDestacado(CampaniaWeb campaniaWeb,
            CategoriaWeb categoriaWeb) throws AvwException {
        
        Boolean destacado = false;
        ConexionAvw c = new ConexionAvw();
        ArrayList<ParamCallable> params = new ArrayList<ParamCallable>();
        int pos = 0;
        
        try {
            logger.info("Verifico si hay destacados");
            params.add(new ParamCallable(++pos,null,OracleTypes.NUMERIC,ParamCallable.OUT));
            params.add(new ParamCallable(++pos,categoriaWeb.getCawCodigo(),OracleTypes.VARCHAR,ParamCallable.IN));
            params.add(new ParamCallable(++pos,campaniaWeb.getCamCodigo(),OracleTypes.VARCHAR,ParamCallable.IN));
            c.abrirConexion();
            int hay= c.getIntCallableStatement(Procedimientos.ARTICULOS_HAY_DESTACADO_CAMPANIA,params,1);
            
            if (hay > 0) {
                destacado = true;
            }
        } catch (SQLException e) {
            // TODO
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
        
        return destacado;
    }
    
    /**
     * Verificar si existen articulos destacados para la campania
     * pasada por parametro.
     * @param campaniaWeb objeto CampaniaWeb con solo el codigo
     * @return true en el caso de que hay articulos destacados y false en caso
     * contrario
     */
    public static Boolean hayArticuloCampaniaDestacado(CampaniaWeb campaniaWeb) throws AvwException {
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        Boolean destacado = false;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos = 0;
        
        sql.append("SELECT COUNT(art_codigo) as cantidad ");
        sql.append("FROM destacados_web ");
        sql.append("WHERE des_nivel LIKE '1' AND cam_codigo LIKE ? ");
        
        
        try {
            logger.info("Verifico si hay destacados");
            al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo().toUpperCase(),java.sql.Types.VARCHAR));
            c.abrirConexion();
            rs= c.getPreparedStatementResultSet(sql.toString(),al);
            
            rs.next();
            
            if (rs.getInt(1) > 0) {
                destacado = true;
            }
        } catch (SQLException e) {
            // TODO
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
        
        return destacado;
    }
    
    /**
     * Listar ArticuloCampania de una campania, de una categoria y
     * con un cierto nivel de destacado
     * @param campaniaWeb CampaniaWeb (solo el codigo)
     * @param categoriaWeb CategoriaWeb (solo el codigo)
     * @param destacado Objeto con el nivel de destacado
     * @return ArrayList de ArticuloCampania con su Articulo como atributo
     * @version revisado el acceso a datos.
     */
    public static ArrayList<ArticuloCampania> listarArticuloCampaniaPorCampaniaCategoriaYNivel(
            CampaniaWeb campaniaWeb,
            CategoriaWeb categoriaWeb,
            DestacadoWeb destacadoWeb) throws AvwException {
        ArrayList<ArticuloCampania> arr = new ArrayList<ArticuloCampania>();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList<ParamCallable> params = new ArrayList<ParamCallable>();
        int pos=0;
        
        
        /*
        sql.append("SELECT * FROM (SELECT acv.art_codigo, acv.acw_consulta, acv.acw_pedido,");
        sql.append("acv.lpad_precio, acv.lpal_precio, acv.art_nombre,");
        sql.append("acv.art_costo_envio, acv.rub_codigo, acv.art_descr_comercial,");
        sql.append("acv.acw_palabras_claves, acv.mar_codigo, acv.mar_nombre,");
        sql.append("acv.caw_codigo, acv.caw_nombre, acv.caw_palabras_claves, faw_codigo, faw_descripcion, faw_nivel ");
        sql.append("FROM articulos_campanias_vista acv, fotos_articulos_web faw ");
        sql.append("WHERE acv.art_codigo = faw.art_codigo (+) ");
        sql.append("AND acv.cam_codigo = ? ");
        sql.append(") art, destacados_web dw ");
        sql.append("WHERE (art.faw_nivel = 1 OR art.faw_nivel IS NULL) ");
        sql.append("AND art.art_codigo = dw.art_codigo ");
        sql.append("AND dw.caw_codigo = ? ");
        sql.append("AND dw.des_nivel = ? ");
         */
        try {
            logger.info("Consulto ArticuloCampania por CampaniaCategoria y Nivel");
            //al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),NUMERIC));
            //al.add(new BoundParam(++pos,categoriaWeb.getCawCodigo(),NUMERIC));
            //al.add(new BoundParam(++pos,destacadoWeb.getDesNivel(),NUMERIC));
            params.add(new ParamCallable(++pos,null,OracleTypes.CURSOR,ParamCallable.OUT));
            params.add(new ParamCallable(++pos,campaniaWeb.getCamCodigo(),OracleTypes.VARCHAR,ParamCallable.IN));
            params.add(new ParamCallable(++pos,categoriaWeb.getCawCodigo(),OracleTypes.VARCHAR,ParamCallable.IN));
            params.add(new ParamCallable(++pos,destacadoWeb.getDesNivel(),OracleTypes.VARCHAR,ParamCallable.IN));
            c.abrirConexion();
            rs =c.getCallableStatement(Procedimientos.ARTICULO_CAMPANIA_POR_CAMPANIA_CATEGORIA_Y_NIVEL_LISTAR,
                    params,1);
            
            while (rs.next()) {
                ArticuloCampania ac = new ArticuloCampania();
                ArticuloWeb aw = new ArticuloWeb();
                FotoArticuloWeb foto = new FotoArticuloWeb();
                CategoriaWeb cat = new CategoriaWeb();
                DestacadoWeb destacado = new DestacadoWeb();
                aw.setArtCodigo(Utiles.noNull(rs.getObject("art_codigo")));
                aw.setArtNombre(Utiles.noNull(rs.getObject("art_nombre")));
                aw.setArtCostoEnvio(Float.parseFloat(Utiles.noNull(rs.getObject("art_costo_envio"),
                        "0")));
                aw.setArtRubro(Utiles.noNull(rs.getObject("rub_codigo")));
                aw.setArtDescripcion(Utiles.noNull(rs.getObject("art_descr_comercial")));
                aw.setArwPalabrasClaves(Utiles.noNull(rs.getObject("acw_palabras_claves")));
                aw.setArtMarcaCodigo(new Marca(Utiles.noNull(rs.getObject("mar_codigo")),
                        Utiles.noNull(rs.getObject("mar_nombre"))));
                
                ArrayList<FotoArticuloWeb> fotos = new ArrayList<FotoArticuloWeb>();
                if (rs.getObject("faw_codigo") != null){
                    foto.setFawCodigo(Utiles.noNull(rs.getObject("faw_codigo")));
                    foto.setFawDescripcion(Utiles.noNull(rs.getObject("faw_Descripcion")));
                    fotos.add(foto);
                }
                aw.setArwFotos(fotos);
                
                cat.setCawCodigo(Utiles.noNull(rs.getObject("caw_codigo")));
                cat.setCawNombre(Utiles.noNull(rs.getObject("caw_nombre")));
                aw.setArwCategoria(cat);
                
                ac.setArcArticulo(aw);
                ac.setArcConsulta(Integer.valueOf(Utiles.noNull(rs.getObject("acw_consulta"),
                        "0")));
                ac.setArcPedido(Integer.valueOf(Utiles.noNull(rs.getObject("acw_pedido"),
                        "0")));
                ac.setArcPrecioDescuento(Float.parseFloat(Utiles.noNull(rs.getObject("LPAD_precio"),
                        "0")));
                ac.setArcPrecioLista(Float.parseFloat(Utiles.noNull(rs.getObject("lpal_precio"),
                        "0")));
                destacado.setDesTitulo(rs.getString("des_titulo"));
                destacado.setDesDescripcion(rs.getString("des_descripcion"));
                destacado.setDesMostrarPrecio(rs.getInt("des_mostrar_precio"));
                ac.setArcDestacado(destacado);
                arr.add(ac);
                
            }
        } catch (SQLException e) {
            // TODO
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
        
        return arr;
    }
    
    /**
     * Listar ArticuloCampania de una campania, de una categoria y
     * con un cierto nivel de destacado
     * @param campaniaWeb CampaniaWeb (solo el codigo)
     * @param categoriaWeb CategoriaWeb (solo el codigo)
     * @param destacado Objeto con el nivel de destacado
     * @return ArrayList de ArticuloCampania con su Articulo como atributo
     * @version revisado el acceso a datos.
     */
    public static ArrayList<ArticuloCampania> listarArticuloCampaniaPorCampaniaCategoria(
            CampaniaWeb campaniaWeb,
            CategoriaWeb categoriaWeb) throws AvwException {
        ArrayList<ArticuloCampania> arr = new ArrayList<ArticuloCampania>();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList<ParamCallable> params = new ArrayList<ParamCallable>();
        int pos=0;

        try {

            logger.info("Consulto ArticuloCampania por CampaniaCategoria y Nivel");
            params.add(new ParamCallable(++pos,null,OracleTypes.CURSOR,ParamCallable.OUT));
            params.add(new ParamCallable(++pos,campaniaWeb.getCamCodigo(),OracleTypes.VARCHAR,ParamCallable.IN));
            params.add(new ParamCallable(++pos,categoriaWeb.getCawCodigo(),OracleTypes.VARCHAR,ParamCallable.IN));
          
            c.abrirConexion();
            rs =c.getCallableStatement(procedimiento.obtenerPropiedad("listarArticulosCampaniaCategoria"),
                    params,1);
            
            while (rs.next()) {
                ArticuloCampania ac = new ArticuloCampania();
                ArticuloWeb aw = new ArticuloWeb();
                FotoArticuloWeb foto = new FotoArticuloWeb();
                CategoriaWeb cat = new CategoriaWeb();
                
                aw.setArtCodigo(Utiles.noNull(rs.getObject("art_codigo")));
                aw.setArtNombre(Utiles.noNull(rs.getObject("art_nombre")));
                aw.setArtCostoEnvio(Float.parseFloat(Utiles.noNull(rs.getObject("art_costo_envio"),
                        "0")));
                aw.setArtRubro(Utiles.noNull(rs.getObject("rub_codigo")));
                aw.setArtDescripcion(Utiles.noNull(rs.getObject("art_descr_comercial")));
                aw.setArwPalabrasClaves(Utiles.noNull(rs.getObject("acw_palabras_claves")));
                aw.setArtMarcaCodigo(new Marca(Utiles.noNull(rs.getObject("mar_codigo")),
                        Utiles.noNull(rs.getObject("mar_nombre"))));
                
                ArrayList<FotoArticuloWeb> fotos = new ArrayList<FotoArticuloWeb>();
                if (rs.getObject("faw_codigo") != null){
                    foto.setFawCodigo(Utiles.noNull(rs.getObject("faw_codigo")));
                    foto.setFawDescripcion(Utiles.noNull(rs.getObject("faw_Descripcion")));
                    fotos.add(foto);
                }
                aw.setArwFotos(fotos);
                
                cat.setCawCodigo(Utiles.noNull(rs.getObject("caw_codigo")));
                cat.setCawNombre(Utiles.noNull(rs.getObject("caw_nombre")));
                aw.setArwCategoria(cat);
                
                ac.setArcArticulo(aw);
                ac.setArcDestacado(new DestacadoWeb((rs.getInt("des_nivel"))));
                ac.setArcConsulta(Integer.valueOf(Utiles.noNull(rs.getObject("acw_consulta"),
                        "0")));
                ac.setArcPedido(Integer.valueOf(Utiles.noNull(rs.getObject("acw_pedido"),
                        "0")));
                ac.setArcPrecioDescuento(Float.parseFloat(Utiles.noNull(rs.getObject("LPAD_precio"),
                        "0")));
                ac.setArcPrecioLista(Float.parseFloat(Utiles.noNull(rs.getObject("lpal_precio"),
                        "0")));
                arr.add(ac);
            }
        } catch (SQLException e) {
            // TODO
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
        
        return arr;
    }



    /**
     * Listar ArticuloCampania de una campania, de una categoria y
     * con un cierto nivel de destacado
     * @param campaniaWeb CampaniaWeb (solo el codigo)
     * @param categoriaWeb CategoriaWeb (solo el codigo)
     * @param destacado Objeto con el nivel de destacado
     * @return ArrayList de ArticuloCampania con su Articulo como atributo
     * @version revisado el acceso a datos.
     */
    public static ArrayList<ArticuloCampania> listarArticuloCampania(CampaniaWeb campaniaWeb,
            CategoriaWeb categoriaWeb,
            DestacadoWeb destacadoWeb) throws AvwException {
        ArrayList<ArticuloCampania> arr = new ArrayList<ArticuloCampania>();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
        
        sql.append("SELECT a.art_codigo,a.art_nombre,dw.caw_codigo,dw.des_nivel,dw.cam_codigo ");
        sql.append("FROM destacados_web dw, articulos a ");
        sql.append("WHERE a.art_codigo = dw.art_codigo ");
        sql.append("AND dw.cam_codigo = ? ");
        sql.append("AND dw.caw_codigo = ? ");
        sql.append("AND dw.des_nivel = ? ");
        
        try {
            logger.info("Consulto ArticuloCampania por CampaniaCategoria y Nivel");
            al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),NUMERIC));
            al.add(new BoundParam(++pos,categoriaWeb.getCawCodigo(),NUMERIC));
            al.add(new BoundParam(++pos,destacadoWeb.getDesNivel(),NUMERIC));
            c.abrirConexion();
            rs =c.getPreparedStatementResultSet(sql,al);
            
            while (rs.next()) {
                ArticuloCampania ac = new ArticuloCampania();
                ArticuloWeb aw = new ArticuloWeb();
                CategoriaWeb cat = new CategoriaWeb();
                DestacadoWeb des = new DestacadoWeb();
                
                aw.setArtCodigo(Utiles.noNull(rs.getObject("art_codigo")));
                aw.setArtNombre(Utiles.noNull(rs.getObject("art_nombre")));
                cat.setCawCodigo(Utiles.noNull(rs.getObject("caw_codigo")));
                aw.setArwCategoria(cat);
                des.setDesNivel(Integer.valueOf(Utiles.noNull(rs.getObject("des_nivel"))));
                
                ac.setArcArticulo(aw);
                ac.setArcDestacado(des);
                
                arr.add(ac);
            }
        } catch (SQLException e) {
            // TODO
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
        
        return arr;
    }
    
     /**
     * Listar ArticuloCampania de una campania relacionados a un articulo
     * @param campaniaWeb CampaniaWeb (solo el codigo)
     * @return ArrayList de ArticuloCampania con su Articulo como atributo
     * @version revisado el acceso a datos.
     */
    public static ArrayList<ArticuloAsociado> listarArticuloCampaniaAsociado(CampaniaWeb campaniaWeb,
            ArticuloWeb articuloWeb, int tipo) throws AvwException {
        ArrayList<ArticuloAsociado> arr = new ArrayList<ArticuloAsociado>();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
     
        sql.append("SELECT aav.cam_codigo, aa.art_codigo_asociado, aav.art_codigo, ");
        sql.append("aav.art_nombre, aa.aras_titulo ");
        sql.append("FROM articulos_asociados aa, articulos_avw aav ");
        sql.append("WHERE aa.art_codigo = ? ");
        sql.append("AND aa.art_codigo_asociado = aav.art_codigo ");
        sql.append("AND aav.cam_codigo = ? ");
        sql.append("AND aa.aras_tipo = ? ");
        
        try {
            logger.info("Consulto ArticuloCampania por Campania");
            
            al.add(new BoundParam(++pos,articuloWeb.getArtCodigo(),VARCHAR));
            al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),VARCHAR));
            al.add(new BoundParam(++pos,tipo,VARCHAR));
            c.abrirConexion();
            rs =c.getPreparedStatementResultSet(sql,al);
            
            while (rs.next()) {
                ArticuloAsociado aa = new ArticuloAsociado();
                ArticuloCampania ac = new ArticuloCampania();
                ArticuloWeb aw = new ArticuloWeb();
                
                aw.setArtCodigo(Utiles.noNull(rs.getObject("art_codigo_asociado")));
                aw.setArtNombre(Utiles.noNull(rs.getObject("art_nombre")));
                
                ac.setArcArticulo(aw);
                
                aa.setArasArticuloCampania(ac);
                aa.setArasTitulo(rs.getString("aras_titulo"));
                arr.add(aa);
            }
        } catch (SQLException e) {
            // TODO
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
        
        return arr;
    }   
  
    /**
     * Listar ArticuloCampania mas consultados de una campania y categoria
     * determinada
     * @param campaniaWeb Campania (solo el codigo)
     * @param categoriaWeb CategoriaWeb (solo el codigo)
     * @return ArrayList de ArticuloCampania con su Articulo como atributo
     * @version revisado el acceso a datos
     */
    public static ArrayList<ArticuloCampania> listarArticulosCampaniaMasConsultadosPorCampaniaYCategoria(CampaniaWeb campaniaWeb,
            CategoriaWeb categoriaWeb) throws AvwException {
        Recurso recurso = new Recurso("negocio.properties");
        
        ArrayList<ArticuloCampania> arr = new ArrayList<ArticuloCampania>();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        String hojas="";
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
        
    try {
        
        //si esto llamo a un procedimiento 
        //sino llamo al sql por no saber utilizar array en pl/sql
        int rows = Integer.parseInt(recurso.obtenerPropiedad("articulosCampaniaMasConsultadosPorCampaniaYCategoria").toString());
        int cant =0;
        int diff =0;
        if (!categoriaWeb.getCawCodigo().equals("-1")){
            sql.setLength(0);
            pos=0;
            sql.append("SELECT * FROM (SELECT acv.art_codigo, acv.acw_consulta, acv.acw_pedido,");
            sql.append("acv.lpad_precio, acv.lpal_precio, acv.art_nombre,");
            sql.append("acv.art_costo_envio, acv.rub_codigo, acv.art_descr_comercial,");
            sql.append("acv.acw_palabras_claves, acv.mar_codigo, acv.mar_nombre,");
            sql.append("acv.caw_codigo, acv.caw_nombre, faw_codigo, faw_descripcion, faw_nivel ");
            sql.append("FROM articulos_avw aa, articulos_campanias_vista acv, fotos_articulos_web faw ");
            sql.append("WHERE acv.art_codigo = faw.art_codigo (+) AND acv.art_codigo = aa.art_codigo ");
            sql.append("AND acv.cam_codigo = ? AND acv.cam_codigo = aa.cam_codigo AND aa.art_es_mas_consultado = 1 ");
            sql.append(")");
            sql.append("WHERE (faw_nivel = 1 OR faw_nivel IS NULL) ");
            hojas = CategoriaDAL.obtenerCategoriasHojasPorCategoriaWeb(
                    categoriaWeb.getCawCodigo());
            hojas =  hojas.substring(0, (hojas.length() - 1));
            sql.append("AND caw_codigo IN ( "); //2
            sql.append(hojas); //2
            sql.append(" ) ");
            sql.append("AND ");
            sql.append(" rownum <= ? ");//3
            al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),NUMERIC));
            al.add(new BoundParam(++pos,rows,NUMERIC));
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql.toString(),al);
            
            while (rs.next()) {
                cant++;
                ArticuloCampania ac = new ArticuloCampania();
                ArticuloWeb aw = new ArticuloWeb();
                FotoArticuloWeb foto = new FotoArticuloWeb();
                CategoriaWeb cat = new CategoriaWeb();
                
                aw.setArtCodigo(Utiles.noNull(rs.getObject("art_codigo")));
                aw.setArtNombre(Utiles.noNull(rs.getObject("art_nombre")));
                aw.setArtCostoEnvio(Float.parseFloat(Utiles.noNull(rs.getObject("art_costo_envio"),
                        "0")));
                aw.setArtRubro(Utiles.noNull(rs.getObject("rub_codigo")));
                aw.setArtDescripcion(Utiles.noNull(rs.getObject("art_descr_comercial")));
                aw.setArwPalabrasClaves(Utiles.noNull(rs.getObject("acw_palabras_claves")));
                aw.setArtMarcaCodigo(new Marca(Utiles.noNull(rs.getObject("mar_codigo")),
                        Utiles.noNull(rs.getObject("mar_nombre"))));
                
                foto.setFawCodigo(Utiles.noNull(rs.getObject("faw_codigo")));
                foto.setFawDescripcion(Utiles.noNull(rs.getObject("faw_Descripcion")));
                ArrayList<FotoArticuloWeb> fotos = new ArrayList<FotoArticuloWeb>();
                fotos.add(foto);
                aw.setArwFotos(fotos);
                
                cat.setCawCodigo(Utiles.noNull(rs.getObject("caw_codigo")));
                cat.setCawNombre(Utiles.noNull(rs.getObject("caw_nombre")));
                aw.setArwCategoria(cat);
                
                ac.setArcArticulo(aw);
                ac.setArcConsulta(Integer.valueOf(Utiles.noNull(rs.getObject("acw_consulta"),
                        "0")));
                ac.setArcPedido(Integer.valueOf(Utiles.noNull(rs.getObject("acw_pedido"),
                        "0")));
                ac.setArcPrecioDescuento(Float.parseFloat(Utiles.noNull(rs.getObject("lpad_precio"),
                        "0")));
                ac.setArcPrecioLista(Float.parseFloat(Utiles.noNull(rs.getObject("lpal_precio"),
                        "0")));
                
                arr.add(ac);
            }
            diff = rows - cant;
            if (rows != cant){
                //Traigo el resto de los articulos que verdaderamente son mas consultados 
                al.clear();
                sql.setLength(0);
                sql.append("SELECT * FROM (SELECT acv.art_codigo, acv.acw_consulta, acv.acw_pedido,");
                sql.append("acv.lpad_precio, acv.lpal_precio, acv.art_nombre,");
                sql.append("acv.art_costo_envio, acv.rub_codigo, acv.art_descr_comercial,");
                sql.append("acv.acw_palabras_claves, acv.mar_codigo, acv.mar_nombre,");
                sql.append("acv.caw_codigo, acv.caw_nombre, faw_codigo, faw_descripcion, faw_nivel ");
                sql.append("FROM articulos_campanias_vista acv, fotos_articulos_web faw ");
                sql.append("WHERE acv.art_codigo = faw.art_codigo (+) ");
                sql.append("AND acv.cam_codigo = ? ");
                if(arr.size()!=0){
                    sql.append("AND acv.art_codigo NOT IN ( ");
                    int numer =0;
                    for(ArticuloCampania articuloCampania : arr){
                        numer++;
                        if(cant == arr.size()){
                            sql.append("'" + articuloCampania.getArcArticulo().getArtCodigo() + "')");
                        }else{
                            sql.append("'" + articuloCampania.getArcArticulo().getArtCodigo() + "', ");
                        }
                    }
                }
                sql.append("ORDER BY acw_consulta DESC ");
                sql.append(")");
                sql.append("WHERE (faw_nivel = 1 OR faw_nivel IS NULL) ");
                sql.append("AND caw_codigo IN ( "); //2
                sql.append(hojas); //2
                sql.append(" ) ");
                sql.append("AND ");
                sql.append(" rownum <= ? ");//3
                pos=0;
                al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),NUMERIC));
                al.add(new BoundParam(++pos,diff,NUMERIC));
                logger.info(sql.toString());
                rs = c.getPreparedStatementResultSet(sql.toString(),al);
                while (rs.next()) {
                    ArticuloCampania ac = new ArticuloCampania();
                    ArticuloWeb aw = new ArticuloWeb();
                    FotoArticuloWeb foto = new FotoArticuloWeb();
                    CategoriaWeb cat = new CategoriaWeb();

                    aw.setArtCodigo(Utiles.noNull(rs.getObject("art_codigo")));
                    aw.setArtNombre(Utiles.noNull(rs.getObject("art_nombre")));
                    aw.setArtCostoEnvio(Float.parseFloat(Utiles.noNull(rs.getObject("art_costo_envio"),
                            "0")));
                    aw.setArtRubro(Utiles.noNull(rs.getObject("rub_codigo")));
                    aw.setArtDescripcion(Utiles.noNull(rs.getObject("art_descr_comercial")));
                    aw.setArwPalabrasClaves(Utiles.noNull(rs.getObject("acw_palabras_claves")));
                    aw.setArtMarcaCodigo(new Marca(Utiles.noNull(rs.getObject("mar_codigo")),
                            Utiles.noNull(rs.getObject("mar_nombre"))));

                    foto.setFawCodigo(Utiles.noNull(rs.getObject("faw_codigo")));
                    foto.setFawDescripcion(Utiles.noNull(rs.getObject("faw_Descripcion")));
                    ArrayList<FotoArticuloWeb> fotos = new ArrayList<FotoArticuloWeb>();
                    fotos.add(foto);
                    aw.setArwFotos(fotos);

                    cat.setCawCodigo(Utiles.noNull(rs.getObject("caw_codigo")));
                    cat.setCawNombre(Utiles.noNull(rs.getObject("caw_nombre")));
                    aw.setArwCategoria(cat);

                    ac.setArcArticulo(aw);
                    ac.setArcConsulta(Integer.valueOf(Utiles.noNull(rs.getObject("acw_consulta"),
                            "0")));
                    ac.setArcPedido(Integer.valueOf(Utiles.noNull(rs.getObject("acw_pedido"),
                            "0")));
                    ac.setArcPrecioDescuento(Float.parseFloat(Utiles.noNull(rs.getObject("lpad_precio"),
                            "0")));
                    ac.setArcPrecioLista(Float.parseFloat(Utiles.noNull(rs.getObject("lpal_precio"),
                            "0")));

                    arr.add(ac);
                }
            }
        }else{
            sql.setLength(0);
            al.clear();
            sql.append("SELECT   * ");
            sql.append("FROM (SELECT acv.art_codigo, acv.acw_consulta, acv.acw_pedido, ");
            sql.append("acv.lpad_precio, acv.lpal_precio, acv.art_nombre, ");
            sql.append("acv.art_costo_envio, acv.rub_codigo, acv.art_descr_comercial, ");
            sql.append("acv.acw_palabras_claves, acv.mar_codigo, acv.mar_nombre, ");
            sql.append("acv.caw_codigo, acv.caw_nombre, faw_codigo, faw_descripcion, ");
            sql.append("faw_nivel ");
            sql.append("FROM articulos_avw aa, articulos_campanias_vista acv, fotos_articulos_web faw ");
            sql.append("WHERE acv.art_codigo = faw.art_codigo(+) AND acv.cam_codigo = ?  ");
            sql.append("AND acv.cam_codigo = aa.cam_codigo AND acv.art_codigo = aa.ART_CODIGO AND aa.art_es_mas_consultado = 1 ) ");
            sql.append("WHERE (faw_nivel = 1 OR faw_nivel IS NULL) AND ROWNUM <= ? ");

            //Parametros
            pos=0;
            al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),NUMERIC));
            al.add(new BoundParam(++pos,rows,NUMERIC));
            
            logger.info(sql.toString());
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql, al);
            
            cant =0;
            
            /*al.add(new ParamCallable(++pos,null,OracleTypes.CURSOR,ParamCallable.OUT));
            al.add(new ParamCallable(++pos,campaniaWeb.getCamCodigo(),OracleTypes.VARCHAR,ParamCallable.IN));
            al.add(new ParamCallable(++pos,recurso.obtenerPropiedad("articulosCampaniaMasConsultadosPorCampaniaYCategoria"),OracleTypes.NUMBER,ParamCallable.IN));
            c.abrirConexion();
            rs = c.getCallableStatement(procedimiento.obtenerPropiedad("listarArticulosCampaniaMasConsultadosPorCampaniaYCategoria"),al,1);*/
            while (rs.next()){
                cant++;
                ArticuloCampania ac = new ArticuloCampania();
                ArticuloWeb aw = new ArticuloWeb();
                FotoArticuloWeb foto = new FotoArticuloWeb();
                CategoriaWeb cat = new CategoriaWeb();

                aw.setArtCodigo(Utiles.noNull(rs.getObject("art_codigo")));
                aw.setArtNombre(Utiles.noNull(rs.getObject("art_nombre")));
                aw.setArtCostoEnvio(Float.parseFloat(Utiles.noNull(rs.getObject("art_costo_envio"),
                        "0")));
                aw.setArtRubro(Utiles.noNull(rs.getObject("rub_codigo")));
                aw.setArtDescripcion(Utiles.noNull(rs.getObject("art_descr_comercial")));
                aw.setArwPalabrasClaves(Utiles.noNull(rs.getObject("acw_palabras_claves")));
                aw.setArtMarcaCodigo(new Marca(Utiles.noNull(rs.getObject("mar_codigo")),
                        Utiles.noNull(rs.getObject("mar_nombre"))));

                foto.setFawCodigo(Utiles.noNull(rs.getObject("faw_codigo")));
                foto.setFawDescripcion(Utiles.noNull(rs.getObject("faw_Descripcion")));
                ArrayList<FotoArticuloWeb> fotos = new ArrayList<FotoArticuloWeb>();
                fotos.add(foto);
                aw.setArwFotos(fotos);

                cat.setCawCodigo(Utiles.noNull(rs.getObject("caw_codigo")));
                cat.setCawNombre(Utiles.noNull(rs.getObject("caw_nombre")));
                aw.setArwCategoria(cat);

                ac.setArcArticulo(aw);
                ac.setArcConsulta(Integer.valueOf(Utiles.noNull(rs.getObject("acw_consulta"),
                        "0")));
                ac.setArcPedido(Integer.valueOf(Utiles.noNull(rs.getObject("acw_pedido"),
                        "0")));
                ac.setArcPrecioDescuento(Float.parseFloat(Utiles.noNull(rs.getObject("lpad_precio"),
                        "0")));
                ac.setArcPrecioLista(Float.parseFloat(Utiles.noNull(rs.getObject("lpal_precio"),
                        "0")));

                arr.add(ac);
            }
            
            diff = rows - cant;
            if (rows != cant){
                sql.setLength(0);
                al.clear();
                sql.append("SELECT   * ");
                sql.append("FROM (SELECT acv.art_codigo, acv.acw_consulta, acv.acw_pedido, ");
                sql.append("acv.lpad_precio, acv.lpal_precio, acv.art_nombre, ");
                sql.append("acv.art_costo_envio, acv.rub_codigo, acv.art_descr_comercial, ");
                sql.append("acv.acw_palabras_claves, acv.mar_codigo, acv.mar_nombre, ");
                sql.append("acv.caw_codigo, acv.caw_nombre, faw_codigo, faw_descripcion, ");
                sql.append("faw_nivel ");
                sql.append("FROM articulos_campanias_vista acv, fotos_articulos_web faw ");
                sql.append("WHERE acv.art_codigo = faw.art_codigo(+) AND acv.cam_codigo = ?  ");
                if(arr.size()!=0){
                    int numer =0;
                    sql.append("AND acv.art_codigo NOT IN ( ");
                    for(ArticuloCampania articuloCampania : arr){
                        numer++;
                        if(cant == arr.size()){
                            sql.append("'" + articuloCampania.getArcArticulo().getArtCodigo()+ "')");
                        }else{
                            sql.append("'" + articuloCampania.getArcArticulo().getArtCodigo() + "', ");
                        }
                    }
                }
                
                sql.append("ORDER BY acw_consulta DESC) ");
                sql.append("WHERE (faw_nivel = 1 OR faw_nivel IS NULL) AND ROWNUM <= ? ");
                
                
                pos=0;
                al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),NUMERIC));
                al.add(new BoundParam(++pos,diff,NUMERIC));
                
                logger.info(sql.toString());
                
                rs = c.getPreparedStatementResultSet(sql, al);

                while (rs.next()){
                    ArticuloCampania ac = new ArticuloCampania();
                    ArticuloWeb aw = new ArticuloWeb();
                    FotoArticuloWeb foto = new FotoArticuloWeb();
                    CategoriaWeb cat = new CategoriaWeb();

                    aw.setArtCodigo(Utiles.noNull(rs.getObject("art_codigo")));
                    aw.setArtNombre(Utiles.noNull(rs.getObject("art_nombre")));
                    aw.setArtCostoEnvio(Float.parseFloat(Utiles.noNull(rs.getObject("art_costo_envio"),
                            "0")));
                    aw.setArtRubro(Utiles.noNull(rs.getObject("rub_codigo")));
                    aw.setArtDescripcion(Utiles.noNull(rs.getObject("art_descr_comercial")));
                    aw.setArwPalabrasClaves(Utiles.noNull(rs.getObject("acw_palabras_claves")));
                    aw.setArtMarcaCodigo(new Marca(Utiles.noNull(rs.getObject("mar_codigo")),
                            Utiles.noNull(rs.getObject("mar_nombre"))));

                    foto.setFawCodigo(Utiles.noNull(rs.getObject("faw_codigo")));
                    foto.setFawDescripcion(Utiles.noNull(rs.getObject("faw_Descripcion")));
                    ArrayList<FotoArticuloWeb> fotos = new ArrayList<FotoArticuloWeb>();
                    fotos.add(foto);
                    aw.setArwFotos(fotos);

                    cat.setCawCodigo(Utiles.noNull(rs.getObject("caw_codigo")));
                    cat.setCawNombre(Utiles.noNull(rs.getObject("caw_nombre")));
                    aw.setArwCategoria(cat);

                    ac.setArcArticulo(aw);
                    ac.setArcConsulta(Integer.valueOf(Utiles.noNull(rs.getObject("acw_consulta"),
                            "0")));
                    ac.setArcPedido(Integer.valueOf(Utiles.noNull(rs.getObject("acw_pedido"),
                            "0")));
                    ac.setArcPrecioDescuento(Float.parseFloat(Utiles.noNull(rs.getObject("lpad_precio"),
                            "0")));
                    ac.setArcPrecioLista(Float.parseFloat(Utiles.noNull(rs.getObject("lpal_precio"),
                            "0")));

                    arr.add(ac);
                }  
            }
        }
        
        } catch (Exception e) {
            // TODO
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
        
        return arr;
    }
    
    /**
     * Listar ArticuloCampania mas pedidos de una campania y categoria
     * determinada
     * @param campaniaWeb CampaniaWeb (solo el codigo)
     * @param categoriaWeb CategoriaWeb (solo el codigo)
     * @return ArrayList de ArticuloCampania con su Articulo como atributo
     * @version revisado el acceso a datos
     */
    public static ArrayList<ArticuloCampania> listarArticulosCampaniaMasPedidosPorCampaniaYCategoria(CampaniaWeb campaniaWeb,
            CategoriaWeb categoriaWeb) throws AvwException {
        
        ArrayList<ArticuloCampania> articulos =
                new ArrayList<ArticuloCampania>();
        StringBuilder sql = new StringBuilder();
        ArticuloCampania articuloCampania = new ArticuloCampania();
        ArticuloWeb articuloWeb = new ArticuloWeb();
        Recurso recurso = new Recurso("negocio.properties");
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        String hojas = "";
        int pos=0;
        ResultSet rs;
        int rows = Integer.parseInt(recurso.obtenerPropiedad("articulosCampaniaMasConsultadosPorCampaniaYCategoria").toString());
        int cant =0;
        int diff =0;
        
        sql.append("SELECT * FROM (SELECT acv.art_codigo, acv.acw_consulta, acv.acw_pedido,");
        sql.append("acv.lpad_precio, acv.lpal_precio, acv.art_nombre,");
        sql.append("acv.art_costo_envio, acv.rub_codigo, acv.art_descr_comercial,");
        sql.append("acv.acw_palabras_claves, acv.mar_codigo, acv.mar_nombre,");
        sql.append("acv.caw_codigo, acv.caw_nombre, faw_codigo, faw_descripcion, faw_nivel ");
        sql.append("FROM articulos_avw aa, articulos_campanias_vista acv, fotos_articulos_web faw ");
        sql.append("WHERE acv.art_codigo = faw.art_codigo (+) ");
        sql.append("AND acv.cam_codigo = ? ");
        sql.append("AND  aa.cam_codigo = acv.cam_codigo ");
        sql.append("AND  acv.art_codigo = aa.art_codigo ");
        sql.append("AND  aa.art_es_mas_pedido = 1 ");
        sql.append(")");
        sql.append("WHERE (faw_nivel = 1 OR faw_nivel IS NULL) ");
        
        al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),NUMERIC));
        
        
        if (!categoriaWeb.getCawCodigo().equals("-1")){
            hojas = CategoriaDAL.obtenerCategoriasHojasPorCategoriaWeb(
                    categoriaWeb.getCawCodigo());
            hojas =  hojas.substring(0, (hojas.length() - 1));
            sql.append("AND caw_codigo IN ( "); //2
            sql.append(hojas); //2
            sql.append(" ) ");
        }
        sql.append("AND ");
        sql.append("rownum <= ? ");//3
        al.add(new BoundParam(++pos,rows,NUMERIC));
        
        
        
        try {
            logger.info(sql.toString());
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql.toString(),al);
            
            while (rs.next()) {
                cant ++;
                FotoArticuloWeb foto = new FotoArticuloWeb();
                CategoriaWeb cat = new CategoriaWeb();
                
                articuloCampania = new ArticuloCampania();
                articuloWeb = new ArticuloWeb();
                articuloWeb.setArtCodigo(Utiles.noNull(rs.getObject("art_codigo")));
                articuloWeb.setArtNombre(Utiles.noNull(rs.getObject("art_nombre")));
                articuloWeb.setArtCostoEnvio(Float.parseFloat(Utiles.noNull(rs.getObject("art_costo_envio"),
                        "0")));
                articuloWeb.setArtRubro(Utiles.noNull(rs.getObject("rub_codigo")));
                articuloWeb.setArtDescripcion(Utiles.noNull(rs.getObject("art_descr_comercial")));
                articuloWeb.setArwPalabrasClaves(Utiles.noNull(rs.getObject("acw_palabras_claves")));
                articuloWeb.setArtMarcaCodigo(new Marca(Utiles.noNull(rs.getObject("mar_codigo")),
                        Utiles.noNull(rs.getObject("mar_nombre"))));
                
                ArrayList<FotoArticuloWeb> fotos = new ArrayList<FotoArticuloWeb>();
                if (rs.getObject("faw_codigo") != null){
                    foto.setFawCodigo(Utiles.noNull(rs.getObject("faw_codigo")));
                    foto.setFawDescripcion(Utiles.noNull(rs.getObject("faw_Descripcion")));
                    fotos.add(foto);
                }
                articuloWeb.setArwFotos(fotos);
                
                cat.setCawCodigo(Utiles.noNull(rs.getObject("caw_codigo")));
                cat.setCawNombre(Utiles.noNull(rs.getObject("caw_nombre")));
                articuloWeb.setArwCategoria(cat);
                
                articuloCampania.setArcArticulo(articuloWeb);
                articuloCampania.setArcConsulta(Integer.valueOf(Utiles.noNull(rs.getObject(2),
                        "0")));
                articuloCampania.setArcPedido(Integer.valueOf(Utiles.noNull(rs.getObject(3),
                        "0")));
                articuloCampania.setArcPrecioDescuento(Float.parseFloat(Utiles.noNull(rs.getObject(4),
                        "0")));
                articuloCampania.setArcPrecioLista(Float.parseFloat(Utiles.noNull(rs.getFloat(5),
                        "0")));
                
                articulos.add(articuloCampania);
            }
            
            diff = rows - cant;
            if (diff!=0){
                sql.setLength(0);
                al.clear();
                pos =0;
                sql.append("SELECT * FROM (SELECT acv.art_codigo, acv.acw_consulta, acv.acw_pedido,");
                sql.append("acv.lpad_precio, acv.lpal_precio, acv.art_nombre,");
                sql.append("acv.art_costo_envio, acv.rub_codigo, acv.art_descr_comercial,");
                sql.append("acv.acw_palabras_claves, acv.mar_codigo, acv.mar_nombre,");
                sql.append("acv.caw_codigo, acv.caw_nombre, faw_codigo, faw_descripcion, faw_nivel ");
                sql.append("FROM  articulos_campanias_vista acv, fotos_articulos_web faw ");
                sql.append("WHERE acv.art_codigo = faw.art_codigo (+) ");
                sql.append("AND acv.cam_codigo = ? ");
                if (articulos.size()!=0){
                    int numero = 0;
                    sql.append("AND acv.art_codigo NOT IN ( ");
                    for(ArticuloCampania artic : articulos){
                        numero++;
                        if(articulos.size()==numero){
                            sql.append("'" + artic.getArcArticulo().getArtCodigo() + "')");
                        }else{
                            sql.append("'" + artic.getArcArticulo().getArtCodigo() + "',");
                        }
                    }
                }
                sql.append("ORDER BY  acw_pedido");
                sql.append(")");
                sql.append("WHERE (faw_nivel = 1 OR faw_nivel IS NULL) ");

                al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),NUMERIC));


                if (!categoriaWeb.getCawCodigo().equals("-1")){
                    sql.append("AND caw_codigo IN ( "); //2
                    sql.append(hojas); //2
                    sql.append(" ) ");
                }
                sql.append("AND ");
                sql.append("rownum <= ? ");//3
                al.add(new BoundParam(++pos,diff,NUMERIC));
                
                logger.info(sql.toString());
                rs = c.getPreparedStatementResultSet(sql.toString(),al);
            
                while (rs.next()) {
                    FotoArticuloWeb foto = new FotoArticuloWeb();
                    CategoriaWeb cat = new CategoriaWeb();

                    articuloCampania = new ArticuloCampania();
                    articuloWeb = new ArticuloWeb();
                    articuloWeb.setArtCodigo(Utiles.noNull(rs.getObject("art_codigo")));
                    articuloWeb.setArtNombre(Utiles.noNull(rs.getObject("art_nombre")));
                    articuloWeb.setArtCostoEnvio(Float.parseFloat(Utiles.noNull(rs.getObject("art_costo_envio"),
                            "0")));
                    articuloWeb.setArtRubro(Utiles.noNull(rs.getObject("rub_codigo")));
                    articuloWeb.setArtDescripcion(Utiles.noNull(rs.getObject("art_descr_comercial")));
                    articuloWeb.setArwPalabrasClaves(Utiles.noNull(rs.getObject("acw_palabras_claves")));
                    articuloWeb.setArtMarcaCodigo(new Marca(Utiles.noNull(rs.getObject("mar_codigo")),
                            Utiles.noNull(rs.getObject("mar_nombre"))));

                    ArrayList<FotoArticuloWeb> fotos = new ArrayList<FotoArticuloWeb>();
                    if (rs.getObject("faw_codigo") != null){
                        foto.setFawCodigo(Utiles.noNull(rs.getObject("faw_codigo")));
                        foto.setFawDescripcion(Utiles.noNull(rs.getObject("faw_Descripcion")));
                        fotos.add(foto);
                    }
                    articuloWeb.setArwFotos(fotos);

                    cat.setCawCodigo(Utiles.noNull(rs.getObject("caw_codigo")));
                    cat.setCawNombre(Utiles.noNull(rs.getObject("caw_nombre")));
                    articuloWeb.setArwCategoria(cat);

                    articuloCampania.setArcArticulo(articuloWeb);
                    articuloCampania.setArcConsulta(Integer.valueOf(Utiles.noNull(rs.getObject(2),
                            "0")));
                    articuloCampania.setArcPedido(Integer.valueOf(Utiles.noNull(rs.getObject(3),
                            "0")));
                    articuloCampania.setArcPrecioDescuento(Float.parseFloat(Utiles.noNull(rs.getObject(4),
                            "0")));
                    articuloCampania.setArcPrecioLista(Float.parseFloat(Utiles.noNull(rs.getFloat(5),
                            "0")));

                    articulos.add(articuloCampania);
                }
            }
        } catch (SQLException e) {
            // TODO
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        }finally {
            c.cerrarConexion();
        }
        
        return articulos;
    }
    /**
     *@param campaniaWeb Campania (solo el codigo)
     *@return ArrayList de ArticuloCampania con su Articulo como atributo
     **/
    public static ArrayList<ArticuloWeb> listarArticulosCampaniasFiltro(
            CampaniaWeb campaniaWeb, int opcion, String filtro) throws AvwException{
        
        ArrayList<ArticuloWeb> arr = new ArrayList<ArticuloWeb>();
        StringBuilder sql = new StringBuilder();
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        ResultSet rs;
        int pos=0;
        
        sql.append("SELECT a.art_codigo, a.art_nombre, cw.caw_codigo, cw.caw_nombre  ");
        sql.append("FROM articulos_categorias_web acw, articulos_campanias ac, categorias_web cw, articulos a ");
        sql.append("WHERE acw.art_codigo = ac.art_codigo ");
        sql.append("AND ac.art_codigo = a.art_codigo ");
        sql.append("AND cw.caw_codigo = acw.caw_codigo ");
        sql.append("AND ac.cam_codigo = ? ");
        String hojas = "";
                
        switch (opcion) {
            case 0:
                sql.append("AND (a.art_codigo LIKE '%");
                sql.append(filtro.toUpperCase());
                sql.append("%'");
                sql.append("OR a.art_nombre LIKE '%");
                sql.append(filtro.toUpperCase());
                sql.append("%')");
                break;
            case 1:
                sql.append("AND a.art_codigo LIKE '%");
                sql.append(filtro.toUpperCase());
                sql.append("%'");
                break;
            case 2:
                sql.append("AND a.art_nombre LIKE '%");
                sql.append(filtro.toUpperCase());
                sql.append("%'");
                break;
            case 3:
                sql.append("AND a.mar_nombre LIKE '%");
                sql.append(filtro.toUpperCase());
                sql.append("%'");
                break;
            case 4:
                sql.append("AND a.mar_nombre LIKE '%");
                sql.append(filtro.toUpperCase());
                sql.append("%'");
                break;
            default:
                break;
        }
        sql.append("ORDER BY a.art_nombre ");
        al.add(new BoundParam(1, campaniaWeb.getCamCodigo(),NUMERIC));
        logger.info("Consulto los articulos relacionados de campa�a: " +campaniaWeb.getCamCodigo());
                logger.info(sql.toString());
        try {
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql.toString(),al);
            while (rs.next()) {
                /* Crea un articulo */
                ArticuloWeb articulo = new ArticuloWeb();
                articulo.setArtCodigo(Utiles.noNull(rs.getObject("art_codigo")));
                articulo.setArtNombre(Utiles.noNull(rs.getObject("art_nombre")));
                
                CategoriaWeb categoria = new CategoriaWeb();
                // se coloca -1 para evitar el buble infinito al hacer getCaw
                categoria.setCawCodigo("-1");
                categoria.setCawNombre("");
                if (!Utiles.noNull(rs.getObject("caw_codigo")).equals("")){
                    categoria.setCawCodigo(Utiles.noNull(rs.getObject("caw_codigo")));
                    categoria.setCawNombre(Utiles.noNull(rs.getObject("caw_nombre")));
                }
                articulo.setArwCategoria(categoria);
                
                arr.add(articulo);
            }   // fin while
        }catch (SQLException e) {
            // TODO
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
        return arr;
    }
    
    /**
     * Lista los articulos asociados del articulo envia por parametro y de la campania tambien enviada por parametro.
     * @param ArticuloWeb (con solo el codigo).
     * @param CampaniaWeb (con solo el codigo).
     * @return ArrayList de articuloAsociado con todos los datos.
     **/
    public static ArrayList<ArticuloAsociado> listarArticulosAsociadosPorCampania(
            ArticuloWeb articuloWeb, CampaniaWeb campaniaWeb) throws AvwException{
        ConexionAvw c = new ConexionAvw();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ArrayList parametros = new ArrayList();
        FotoArticuloWeb foto;
        ArrayList<ArticuloAsociado> arrayAsociado = new ArrayList<ArticuloAsociado>();
        int pos = 0;
        
        sql.append("SELECT ar.ART_CODIGO, ar.ART_NOMBRE, ar.MAR_CODIGO, ar.MAR_NOMBRE, " );
        sql.append("ara.ARAS_TITULO, ara.ARAS_TIPO,ar.PRECIO, ar.PRECIO_DESCUENTO, ");
        sql.append("ar.PRECIO, ar.PRECIO_DESCUENTO, ar.ART_DESCR_COMERCIAL, ");
        sql.append("fw.FAW_CODIGO, fw.FAW_NIVEL, fw.FAW_DESCRIPCION ");
        sql.append("from articulos_avw ar, articulos_asociados ara, fotos_articulos_web fw ");
        sql.append("WHERE ara.ART_CODIGO = ? ");
        sql.append("AND ara.CAM_CODIGO = ? AND ara.ART_CODIGO_ASOCIADO  = ar.ART_CODIGO ");
        sql.append("AND ara.CAM_CODIGO = ar.CAM_CODIGO ");
        sql.append("AND ar.ART_CODIGO = fw.ART_CODIGO (+) ");
        sql.append("AND fw.FAW_NIVEL = 1 ");
        
        parametros.add(new BoundParam(1,articuloWeb.getArtCodigo(), VARCHAR));
        parametros.add(new BoundParam(2,campaniaWeb.getCamCodigo(), VARCHAR));
        try {
            
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,parametros);
            while(rs.next()){
                ArticuloAsociado asociado = new ArticuloAsociado();
                ArticuloWeb artWeb = new ArticuloWeb(rs.getString("art_codigo"));
                artWeb.setArtNombre(rs.getString("art_nombre"));
                artWeb.setArtMarcaCodigo(new Marca(rs.getString("mar_codigo"),rs.getString("mar_nombre")));
                ArticuloCampania artCampania = new ArticuloCampania();
                artCampania.setArcPrecioDescuento(Float.parseFloat(Utiles.noNull(rs.getObject("precio"),
                        "0")));
                artCampania.setArcPrecioLista(Float.parseFloat(Utiles.noNull(rs.getObject("precio_descuento"),
                        "0")));
                ArrayList<FotoArticuloWeb> fotos = new ArrayList<FotoArticuloWeb>();
                
                if (rs.getObject("faw_codigo") != null){
                    foto = new FotoArticuloWeb();
                    foto.setFawCodigo(Utiles.noNull(rs.getObject("faw_codigo")));
                    foto.setFawDescripcion(Utiles.noNull(rs.getObject("faw_Descripcion")));
                    fotos.add(foto);
                }
                artWeb.setArwFotos(fotos);
                artCampania.setArcArticulo(artWeb);
                
                asociado.setArasArticuloCampania(artCampania);
                asociado.setArasTipo(rs.getInt("aras_tipo"));
                asociado.setArasTitulo(rs.getString("aras_titulo"));
                arrayAsociado.add(asociado);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        
        return arrayAsociado;
    }
    
    /**
     * Listar ArticuloCampania mas consultados relacionados a un articulo y
     * de una campania determinada
     * @param campaniaWeb Campania (solo el codigo)
     * @param articuloWeb Articulo (solo el codigo)
     * @return ArrayList de ArticuloCampania con su Articulo como atributo
     * @version revisado el acceso a datos
     */
    public static ArrayList<ArticuloCampania> listarArticulosCampaniaRelacionadosDeArticuloMasConsultados(CampaniaWeb campaniaWeb,
            ArticuloWeb articuloWeb) throws AvwException {
        Recurso recurso = new Recurso("negocio.properties");
        
        ArrayList<ArticuloCampania> arr = new ArrayList<ArticuloCampania>();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        String hojas="";
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
        
        /*
        sql.append("SELECT acv.art_codigo, acv.acw_consulta, acv.acw_pedido, acv.lpad_precio, acv.lpal_precio, ");
        sql.append("acv.art_nombre, acv.art_costo_envio, acv.rub_codigo, ");
        sql.append("acv.art_descr_comercial, acv.acw_palabras_claves, acv.mar_codigo, acv.mar_nombre, ");
        sql.append("acv.caw_codigo, acv.caw_nombre, faw.faw_codigo, faw.faw_descripcion ");
        sql.append("FROM articulos_campanias_vista acv, ");
        sql.append("fotos_articulos_web faw ");
        sql.append("WHERE acv.art_codigo = faw.art_codigo ");
        sql.append("AND faw.faw_nivel = 1 ");
        sql.append("AND acv.cam_codigo LIKE ? ");
        sql.append("AND acv.art_codigo NOT LIKE ? ");
        sql.append("AND EXISTS (");
        sql.append("SELECT rcw.caw_codigo_hijo ");
        sql.append("FROM relacion_categorias_web rcw ");
        sql.append("WHERE rcw.caw_codigo_hijo = acv.caw_codigo ");
        sql.append("AND rcw.caw_codigo_padre LIKE ? ) ");
         */
        
        sql.append("SELECT * FROM (SELECT acv.art_codigo, acv.acw_consulta, acv.acw_pedido,");
        sql.append("acv.lpad_precio, acv.lpal_precio, acv.art_nombre,");
        sql.append("acv.art_costo_envio, acv.rub_codigo, acv.art_descr_comercial,");
        sql.append("acv.acw_palabras_claves, acv.mar_codigo, acv.mar_nombre,");
        sql.append("acv.caw_codigo, acv.caw_nombre, faw_codigo, faw_descripcion, faw_nivel ");
        sql.append("FROM articulos_campanias_vista acv, fotos_articulos_web faw ");
        sql.append("WHERE acv.art_codigo = faw.art_codigo (+) ");
        sql.append("AND acv.cam_codigo = ? ");
        sql.append(") art ");
        sql.append("WHERE (art.faw_nivel = 1 OR art.faw_nivel IS NULL) ");
        sql.append("AND art.art_codigo NOT LIKE ? ");
        sql.append("AND EXISTS (");
        sql.append("SELECT rcw.caw_codigo_hijo ");
        sql.append("FROM relacion_categorias_web rcw ");
        sql.append("WHERE rcw.caw_codigo_hijo = art.caw_codigo ");
        sql.append("AND rcw.caw_codigo_padre LIKE ? ) ");
        
        al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),NUMERIC));
        al.add(new BoundParam(++pos,articuloWeb.getArtCodigo(),VARCHAR));
        al.add(new BoundParam(++pos,articuloWeb.getArwCategoria().getCawCodigo(),NUMERIC));
        
        sql.append("AND ");
        sql.append(" rownum <= ? ");//3
        sql.append(" ORDER BY  art.acw_consulta DESC");
        
        try {
            al.add(new BoundParam(++pos,recurso.obtenerPropiedad("articulosCampaniaRelacionadosDeArticuloMasConsultados"),NUMERIC));
            logger.info("Consulto los articulos mas consultados relacionados de campania: " +campaniaWeb.getCamCodigo());
            logger.info("Consulto los articulos mas consultados relacionados de articulo con categoria: " +articuloWeb.getArwCategoria().getCawCodigo());
            logger.info("Consulto los articulos mas consultados relacionados de rownum: " +recurso.obtenerPropiedad("articulosCampaniaMasConsultadosPorCampaniaYCategoria"));
            
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql.toString(),al);
            
            while (rs.next()) {
                ArticuloCampania ac = new ArticuloCampania();
                ArticuloWeb aw = new ArticuloWeb();
                FotoArticuloWeb foto = new FotoArticuloWeb();
                CategoriaWeb cat = new CategoriaWeb();
                
                aw.setArtCodigo(Utiles.noNull(rs.getObject("art_codigo")));
                aw.setArtNombre(Utiles.noNull(rs.getObject("art_nombre")));
                aw.setArtCostoEnvio(Float.parseFloat(Utiles.noNull(rs.getObject("art_costo_envio"),
                        "0")));
                aw.setArtRubro(Utiles.noNull(rs.getObject("rub_codigo")));
                aw.setArtDescripcion(Utiles.noNull(rs.getObject("art_descr_comercial")));
                aw.setArwPalabrasClaves(Utiles.noNull(rs.getObject("acw_palabras_claves")));
                aw.setArtMarcaCodigo(new Marca(Utiles.noNull(rs.getObject("mar_codigo")),
                        Utiles.noNull(rs.getObject("mar_nombre"))));
                
                foto.setFawCodigo(Utiles.noNull(rs.getObject("faw_codigo")));
                foto.setFawDescripcion(Utiles.noNull(rs.getObject("faw_Descripcion")));
                ArrayList<FotoArticuloWeb> fotos = new ArrayList<FotoArticuloWeb>();
                fotos.add(foto);
                aw.setArwFotos(fotos);
                
                cat.setCawCodigo(Utiles.noNull(rs.getObject("caw_codigo")));
                cat.setCawNombre(Utiles.noNull(rs.getObject("caw_nombre")));
                aw.setArwCategoria(cat);
                
                ac.setArcArticulo(aw);
                ac.setArcConsulta(Integer.valueOf(Utiles.noNull(rs.getObject("acw_consulta"),
                        "0")));
                ac.setArcPedido(Integer.valueOf(Utiles.noNull(rs.getObject("acw_pedido"),
                        "0")));
                ac.setArcPrecioDescuento(Float.parseFloat(Utiles.noNull(rs.getObject("lpad_precio"),
                        "0")));
                ac.setArcPrecioLista(Float.parseFloat(Utiles.noNull(rs.getObject("lpal_precio"),
                        "0")));
                arr.add(ac);
            }
        } catch (SQLException e) {
            // TODO
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
        
        return arr;
    }
    
    /**
     * Listar ArticuloCampania de una campania, categoria o marca;
     * filtrado tambien por el nombre
     * @param campaniaWeb CampaniaWeb (solo el codigo)
     * @param busqueda campo de busqueda para el nombre del articulo
     * @param categoriaWeb CategoriaWeb (solo el codigo)
     * @param marca Marca (solo el codigo)
     * @param int ordenamiento (tipo de ordenamiento - 0: nombreArticulo, 1: marca,
     * 2: categoria, 3: menor precio, 4: mayor precio).
     * @return ArrayList de ArticuloCampania con su Articulo como atributo
     * @Nota solo busca por el nombre del articulo
     * @version
     */
    public static ArrayList<ArticuloCampania> listarArticulosCampaniaBusqueda(CampaniaWeb campaniaWeb,
            String busqueda,
            CategoriaWeb categoriaWeb,
            Marca marca,
            int ordenamiento) throws AvwException {
        ArrayList<ArticuloCampania> articulos =
                new ArrayList<ArticuloCampania>();
        StringBuilder sql = new StringBuilder();
        ArticuloCampania articuloCampania = new ArticuloCampania();
        ArticuloWeb articuloWeb = new ArticuloWeb();
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        ResultSet rs;
        String hojas = "";
        int pos=0;
        
        /*
        sql.append("SELECT acv.art_codigo, acv.acw_consulta, acv.acw_pedido, acv.lpad_precio, acv.lpal_precio, ");
        sql.append("acv.art_nombre, acv.art_costo_envio, acv.rub_codigo, ");
        sql.append("acv.art_descr_comercial, acv.acw_palabras_claves, acv.mar_codigo, acv.mar_nombre, ");
        sql.append("acv.caw_codigo, acv.caw_nombre, faw.faw_codigo, faw.faw_descripcion ");
        sql.append("FROM articulos_campanias_vista acv, ");
        sql.append("fotos_articulos_web faw ");
        sql.append("WHERE acv.art_codigo = faw.art_codigo ");
        sql.append("AND faw.faw_nivel = 1 ");
        sql.append("AND acv.cam_codigo LIKE ? "); //1
         */
        
        sql.append("SELECT * FROM (SELECT acv.art_codigo, acv.acw_consulta, acv.acw_pedido,");
        sql.append("acv.lpad_precio, acv.lpal_precio, acv.art_nombre,");
        sql.append("acv.art_costo_envio, acv.rub_codigo, acv.art_descr_comercial,");
        sql.append("acv.acw_palabras_claves, acv.mar_codigo, acv.mar_nombre,");
        sql.append("acv.caw_codigo, acv.caw_nombre, acv.caw_palabras_claves, faw_codigo, faw_descripcion, faw_nivel ");
        sql.append("FROM articulos_campanias_vista acv, fotos_articulos_web faw ");
        sql.append("WHERE acv.art_codigo = faw.art_codigo (+) ");
        sql.append("AND acv.cam_codigo = ? ");
        sql.append(")");
        sql.append("WHERE (faw_nivel = 1 OR faw_nivel IS NULL) ");
        al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(), NUMERIC));
        
        if (!categoriaWeb.getCawCodigo().equals("-1")){
            hojas = CategoriaDAL.obtenerCategoriasHojasPorCategoriaWeb(
                    categoriaWeb.getCawCodigo());
            hojas =  hojas.substring(0, (hojas.length() - 1));
            sql.append("AND caw_codigo IN ( "); //2
            sql.append(hojas); //2
            sql.append(" ) ");
        }
        
        if (!marca.getMarCodigo().equals("-1")) {
            sql.append("AND mar_codigo LIKE ? ");
            al.add(new BoundParam(++pos,marca.getMarCodigo(), VARCHAR));
        }
        sql.append("AND (art_nombre LIKE  ? ");
        sql.append("OR acw_palabras_claves LIKE ? ");
        sql.append("OR caw_nombre LIKE ? ");
        sql.append("OR caw_palabras_claves LIKE ? ");
        sql.append(")");
        al.add(new BoundParam(++pos,"%"+busqueda+"%", VARCHAR));
        al.add(new BoundParam(++pos,"%"+busqueda+"%", VARCHAR));
        al.add(new BoundParam(++pos,"%"+busqueda+"%", VARCHAR));
        al.add(new BoundParam(++pos,"%"+busqueda+"%", VARCHAR));
        
        switch (ordenamiento) {
            case 0:
                sql.append("ORDER BY art_nombre ");
                break;
            case 1:
                sql.append("ORDER BY mar_nombre ");
                break;
            case 2:
                sql.append("ORDER BY caw_nombre ");
                break;
            case 3:
                sql.append("ORDER BY lpad_precio DESC ");
                break;
            case 4:
                sql.append("ORDER BY lpad_precio ASC ");
                break;
            default:
                break;
        }
        
        
        try {
            logger.info("Consulto articilo segun busqeda.");
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,al);
            
            FotoArticuloWeb foto;
            CategoriaWeb cat;
            
            while (rs.next()) {
                
                articuloCampania = new ArticuloCampania();
                articuloWeb = new ArticuloWeb();
                articuloWeb.setArtCodigo(Utiles.noNull(rs.getObject("art_codigo")));
                articuloWeb.setArtNombre(Utiles.noNull(rs.getObject("art_nombre")));
                articuloWeb.setArtCostoEnvio(Float.parseFloat(Utiles.noNull(rs.getObject("art_costo_envio"),
                        "0")));
                articuloWeb.setArtRubro(Utiles.noNull(rs.getObject("rub_codigo")));
                articuloWeb.setArtDescripcion(Utiles.noNull(rs.getObject("art_descr_comercial")));
                articuloWeb.setArwPalabrasClaves(Utiles.noNull(rs.getObject("acw_palabras_claves")));
                articuloWeb.setArtMarcaCodigo(new Marca(Utiles.noNull(rs.getObject("mar_codigo")),
                        Utiles.noNull(rs.getObject("mar_nombre"))));
                
                ArrayList<FotoArticuloWeb> fotos = new ArrayList<FotoArticuloWeb>();
                if (rs.getObject("faw_codigo") != null){
                    foto = new FotoArticuloWeb();
                    foto.setFawCodigo(Utiles.noNull(rs.getObject("faw_codigo")));
                    foto.setFawDescripcion(Utiles.noNull(rs.getObject("faw_Descripcion")));
                    fotos.add(foto);
                }
                articuloWeb.setArwFotos(fotos);
                
                cat = new CategoriaWeb();
                cat.setCawCodigo(Utiles.noNull(rs.getObject("caw_codigo")));
                cat.setCawNombre(Utiles.noNull(rs.getObject("caw_nombre")));
                articuloWeb.setArwCategoria(cat);
                
                articuloCampania.setArcArticulo(articuloWeb);
                articuloCampania.setArcConsulta(Integer.valueOf(Utiles.noNull(rs.getObject(2),
                        "0")));
                articuloCampania.setArcPedido(Integer.valueOf(Utiles.noNull(rs.getObject(3),
                        "0")));
                articuloCampania.setArcPrecioDescuento(Float.parseFloat(Utiles.noNull(rs.getObject(4),
                        "0")));
                articuloCampania.setArcPrecioLista(Float.parseFloat(Utiles.noNull(rs.getFloat(5),
                        "0")));
                articulos.add(articuloCampania);
            }
        } catch (SQLException e) {
            // TODO
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        }finally {
            c.cerrarConexion();
        }
        
        return articulos;
    }
    
    /**
     * Listar ArticuloCampania de una campania y una categoria
     * @param campaniaWeb CampaniaWeb (solo el codigo)
     * @param categoriaWeb CategoriaWeb (solo el codigo)
     * @return ArrayList de ArticuloCampania con su articulo como atributo
     * @param int ordenamiento (0: nombre, 1: marca, 2: categoria,
     * 3: menor precio, 4: mayor precio).
     */
    public static ArrayList<ArticuloCampania> listarArticulosCampaniaPorCategoria(CampaniaWeb campaniaWeb,
            CategoriaWeb categoriaWeb,
            int ordenamiento) throws AvwException {
        ArrayList<ArticuloCampania> articulos =
                new ArrayList<ArticuloCampania>();
        StringBuilder sql = new StringBuilder();
        ArticuloCampania articuloCampania = new ArticuloCampania();
        ArticuloWeb articuloWeb = new ArticuloWeb();
        ConexionAvw c = new ConexionAvw();
        int pos=0;
        ResultSet rs;
        ArrayList al = new ArrayList();
        
        /*
        sql.append("SELECT acv.art_codigo, acv.acw_consulta, acv.acw_pedido, acv.lpad_precio, acv.lpal_precio, ");
        sql.append("acv.art_nombre, acv.art_costo_envio, acv.rub_codigo, ");
        sql.append("acv.art_descr_comercial, acv.acw_palabras_claves, acv.mar_codigo, acv.mar_nombre, ");
        sql.append("acv.caw_codigo, acv.caw_nombre, faw.faw_codigo, faw.faw_descripcion ");
        sql.append("FROM articulos_campanias_vista acv, ");
        sql.append("fotos_articulos_web faw ");
        sql.append("WHERE acv.art_codigo = faw.art_codigo ");
        sql.append("AND faw.faw_nivel = 1 ");
        sql.append("AND acv.cam_codigo LIKE ? ");
        sql.append("AND acv.caw_codigo = ? ");
         */
        
        sql.append("SELECT * FROM (SELECT acv.art_codigo, acv.acw_consulta, acv.acw_pedido,");
        sql.append("acv.lpad_precio, acv.lpal_precio, acv.art_nombre,");
        sql.append("acv.art_costo_envio, acv.rub_codigo, acv.art_descr_comercial,");
        sql.append("acv.acw_palabras_claves, acv.mar_codigo, acv.mar_nombre,");
        sql.append("acv.caw_codigo, acv.caw_nombre, acv.caw_palabras_claves, faw_codigo, faw_descripcion, faw_nivel ");
        sql.append("FROM articulos_campanias_vista acv, fotos_articulos_web faw ");
        sql.append("WHERE acv.art_codigo = faw.art_codigo (+) ");
        sql.append("AND acv.cam_codigo = ? ");
        sql.append(")");
        sql.append("WHERE (faw_nivel = 1 OR faw_nivel IS NULL) ");
        sql.append("AND caw_codigo = ? ");
        
        al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),NUMERIC));
        al.add(new BoundParam(++pos,categoriaWeb.getCawCodigo(),NUMERIC));
        
        switch (ordenamiento) {
            case 0:
                sql.append("ORDER BY art_nombre ");
                break;
            case 1:
                sql.append("ORDER BY mar_nombre ");
                break;
            case 2:
                sql.append("ORDER BY caw_nombre ");
                break;
            case 3:
                sql.append("ORDER BY lpad_precio DESC ");
                break;
            case 4:
                sql.append("ORDER BY lpad_precio ASC ");
                break;
            default:
                break;
        }
        
        try {
            FotoArticuloWeb foto;
            CategoriaWeb cat;
            
            logger.info(sql.toString());
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,al);
            
            while (rs.next()) {
                
                articuloCampania = new ArticuloCampania();
                articuloWeb = new ArticuloWeb();
                articuloWeb.setArtCodigo(Utiles.noNull(rs.getObject("art_codigo")));
                articuloWeb.setArtNombre(Utiles.noNull(rs.getObject("art_nombre")));
                articuloWeb.setArtCostoEnvio(Float.parseFloat(Utiles.noNull(rs.getObject("art_costo_envio"),
                        "0")));
                articuloWeb.setArtRubro(Utiles.noNull(rs.getObject("rub_codigo")));
                articuloWeb.setArtDescripcion(Utiles.noNull(rs.getObject("art_descr_comercial")));
                articuloWeb.setArwPalabrasClaves(Utiles.noNull(rs.getObject("acw_palabras_claves")));
                articuloWeb.setArtMarcaCodigo(new Marca(Utiles.noNull(rs.getObject("mar_codigo")),
                        Utiles.noNull(rs.getObject("mar_nombre"))));
                
                foto = new FotoArticuloWeb();
                foto.setFawCodigo(Utiles.noNull(rs.getObject("faw_codigo")));
                foto.setFawDescripcion(Utiles.noNull(rs.getObject("faw_Descripcion")));
                ArrayList<FotoArticuloWeb> fotos = new ArrayList<FotoArticuloWeb>();
                fotos.add(foto);
                articuloWeb.setArwFotos(fotos);
                
                cat = new CategoriaWeb();
                cat.setCawCodigo(Utiles.noNull(rs.getObject("caw_codigo")));
                cat.setCawNombre(Utiles.noNull(rs.getObject("caw_nombre")));
                articuloWeb.setArwCategoria(cat);
                
                articuloCampania.setArcArticulo(articuloWeb);
                articuloCampania.setArcConsulta(Integer.valueOf(Utiles.noNull(rs.getObject(2),
                        "0")));
                articuloCampania.setArcPedido(Integer.valueOf(Utiles.noNull(rs.getObject(3),
                        "0")));
                articuloCampania.setArcPrecioDescuento(Float.parseFloat(Utiles.noNull(rs.getObject(4),
                        "0")));
                articuloCampania.setArcPrecioLista(Float.parseFloat(Utiles.noNull(rs.getObject(5),
                        "0")));
                
                articulos.add(articuloCampania);
            }
        } catch (SQLException e) {
            // TODO
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        }finally {
            c.cerrarConexion();
        }
        
        return articulos;
    }
    
    /**
     * Listar las marcas existente en el sistema
     * @return ArrayList de objetos Marca
     */
    public static ArrayList<Marca> listarMarca() throws AvwException {
        ArrayList<Marca> marcas = new ArrayList();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        
        sql.append("SELECT ");
        sql.append("mar_codigo, ");
        sql.append("mar_nombre ");
        sql.append("FROM marcas ORDER BY 2 ");
        
        try {
            logger.info("Consulto todas las Marcas");
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,null);
            
            while (rs.next()) {
                Marca marca = new Marca();
                
                marca.setMarCodigo(Utiles.noNull(rs.getObject("mar_codigo")));
                marca.setMarNombre(Utiles.noNull(rs.getObject("mar_nombre")));
                
                marcas.add(marca);
            }
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
        
        return marcas;
    }
    
    /**
     * Obtener el objeto Marca de un articulo que se pasa
     * por parametro
     * @param articuloWeb ArticuloWeb (solo el codigo)
     * @return objeto Marca
     */
    public static Marca obtenerMarcaDeArticulo(ArticuloWeb articuloWeb) throws AvwException {
        Marca marca = new Marca();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
        
        sql.append("SELECT m.mar_codigo, m.mar_nombre ");
        sql.append("FROM marcas m, articulos a ");
        sql.append("WHERE m.mar_codigo = a.mar_codigo ");
        sql.append("AND a.art_codigo LIKE ? ");
        
        al.add(new BoundParam(++pos,articuloWeb.getArtCodigo(), VARCHAR ));
        try {
            logger.info("Consulto la marca de un articulo determinado");
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,al);
            
            rs.next();
            marca.setMarCodigo(Utiles.noNull(rs.getObject("mar_codigo")));
            marca.setMarNombre(Utiles.noNull(rs.getObject("mar_nombre")));
            
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
        
        return marca;
    }
    
    /**
     * Obtener el articulo a partir del codigo del objeto
     * que se pasa por parametro
     * @param articuloWeb ArticuloWeb (solo el codigo)
     * @return ArticuloWeb con todos sus datos
     */
    public static ArticuloWeb obtenerArticuloWeb(ArticuloWeb articuloWeb) throws AvwException {
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
        
        sql.append("SELECT a.art_codigo, a.art_nombre, round(a.art_costo_envio,2) as art_costo_envio, ");
        sql.append("a.rub_codigo, a.art_descr_comercial, acw.acw_palabras_claves ");
        sql.append("FROM articulos_categorias_web acw, articulos a ");
        sql.append("WHERE a.art_codigo = acw.art_codigo(+) ");
        sql.append("AND a.art_codigo LIKE  ? ");
        al.add(new BoundParam(++pos,articuloWeb.getArtCodigo(),VARCHAR));
        
        
        try {
            logger.info("Consulto un articulo con codigo determinado");
            logger.info(sql.toString());
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,al);
            
            rs.next();
            articuloWeb.setArtCodigo(Utiles.noNull(rs.getObject("art_codigo")));
            articuloWeb.setArtNombre(Utiles.noNull(rs.getObject("art_nombre")));
            articuloWeb.setArtCostoEnvio(Float.parseFloat(Utiles.noNull(rs.getObject("art_costo_envio"),
                    "0")));
            articuloWeb.setArtRubro(Utiles.noNull(rs.getObject("rub_codigo")));
            articuloWeb.setArtDescripcion(Utiles.noNull(rs.getObject("art_descr_comercial")));
            articuloWeb.setArwPalabrasClaves(Utiles.noNull(rs.getObject(6)));
            
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
            
        } finally {
            c.cerrarConexion();
        }
        
        return articuloWeb;
    }
    
    /**
     * Obtener el articulo sin categoria a partir del codigo del objeto
     * que se pasa por parametro. El articulo se obtendra de la tabla articulos_etercor.
     * @param articuloWeb ArticuloWeb (solo el codigo)
     * @return ArticuloWeb con todos sus datos
     */
    public static ArticuloWeb obtenerArticuloWebSinCategoria(ArticuloWeb articuloWeb) throws AvwException {
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
        
        sql.append("SELECT DISTINCT(a.art_codigo), a.art_nombre, round(a.art_costo_envio,2) as art_costo_envio, ");
        sql.append("a.rub_codigo,a.mar_codigo, a.mar_nombre, a.art_descr_comercial, acw.acw_palabras_claves ");
        sql.append("FROM articulos_avw a, articulos_categorias_web acw ");
        sql.append("WHERE a.art_codigo = acw.art_codigo(+) ");
        sql.append("AND a.art_codigo LIKE  ? ");
        
        al.add(new BoundParam(++pos,articuloWeb.getArtCodigo(),VARCHAR));
        
        
        try {
            logger.info("Consulto un articulo con codigo determinado");
            logger.info(sql.toString());
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,al);
            
            rs.next();
            articuloWeb.setArtCodigo(Utiles.noNull(rs.getObject("art_codigo")));    
            articuloWeb.setArtNombre(Utiles.noNull(rs.getObject("art_nombre")));
            articuloWeb.setArtCostoEnvio(Float.parseFloat(Utiles.noNull(rs.getObject("art_costo_envio"),
                    "0")));
            articuloWeb.setArtRubro(Utiles.noNull(rs.getObject("rub_codigo")));
            articuloWeb.setArtDescripcion(Utiles.noNull(rs.getObject("art_descr_comercial")));
            articuloWeb.setArwPalabrasClaves(Utiles.noNull(rs.getObject("acw_palabras_claves")));
            Marca marca = new Marca(Utiles.noNull(rs.getObject("mar_codigo")));
            marca.setMarNombre(Utiles.noNull(rs.getObject("mar_nombre")));
            articuloWeb.setArtMarcaCodigo(marca);
            
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
            
        } finally {
            c.cerrarConexion();
        } 
        
        return articuloWeb;
    }
    /**
     * Obtener el objeto ArticuloCampania a partir de un articulo y
     * una campania pasados por parametro
     * @param campaniaWeb CampaniaWeb (solo el codigo)
     * @param articuloWeb ArticuloWeb (solo el codigo)
     * @return DestacadoWeb
     */
    public static DestacadoWeb obtenerArticuloDestacado(CampaniaWeb campaniaWeb,
            ArticuloWeb articuloWeb, String nivel) throws AvwException {
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        DestacadoWeb destacado = new DestacadoWeb();
        ArrayList al = new ArrayList();
        int pos=0;
        
        sql.append("SELECT dw.art_codigo, dw.cam_codigo, dw.des_nivel, dw.caw_codigo, ");
        sql.append("dw.des_titulo, dw.des_descripcion, dw.des_mostrar_precio ");
        sql.append("FROM destacados_web dw ");
        sql.append("WHERE dw.art_codigo = ? and dw.cam_codigo = ? ");
        sql.append("and dw.des_nivel = ? ");
        al.add(new BoundParam(++pos,articuloWeb.getArtCodigo(),VARCHAR));
        al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),NUMERIC));
        al.add(new BoundParam(++pos,nivel,VARCHAR));
        
        try {
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,al);
            rs.next();
            CategoriaWeb categoria = new CategoriaWeb(String.valueOf(rs.getInt("caw_codigo")));
            destacado.setDesNivel(rs.getInt("des_nivel"));
            destacado.setDesTitulo(rs.getString("des_titulo"));
            destacado.setDesDescripcion(rs.getString("des_descripcion"));
            destacado.setDesMostrarPrecio(rs.getInt("des_mostrar_precio"));

            logger.info("Articulo: " + articuloWeb.getArtCodigo());
            
        } catch (SQLException e) {
            logger.info("No se eoncontro articulo con el codigo: " +
                    articuloWeb.getArtCodigo() + " y la campania: " +
                    campaniaWeb.getCamCodigo().toUpperCase());
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
            
        } finally {
            c.cerrarConexion();
        }
        
        return destacado;
    }

    /**
     * Obtener el objeto ArticuloCampania a partir de un articulo y
     * una campania pasados por parametro
     * @param campaniaWeb CampaniaWeb (solo el codigo)
     * @param articuloWeb ArticuloWeb (solo el codigo)
     * @return ArticuloCampania
     */
    public static ArticuloCampania obtenerArticuloCampania(CampaniaWeb campaniaWeb,
            ArticuloWeb articuloWeb) throws AvwException {
        ArticuloCampania articuloCampania;
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
        
        /*
        sql.append("SELECT acv.acw_consulta, acv.acw_pedido, acv.lpad_precio, acv.lpal_precio, ");
        sql.append("acv.art_codigo, acv.art_nombre, acv.art_costo_envio, acv.rub_codigo, ");
        sql.append("acv.art_descr_comercial, acv.acw_palabras_claves, acv.mar_codigo, acv.mar_nombre, acv.caw_codigo, acv.caw_nombre ");
        sql.append("FROM articulos_campanias_vista acv ");
        sql.append("WHERE ");
        sql.append("acv.art_codigo LIKE  ? ");
        sql.append("AND acv.cam_codigo = ? ");
         */
        
        sql.append("SELECT * FROM (SELECT acv.art_codigo, acv.acw_consulta, acv.acw_pedido,");
        sql.append("acv.lpad_precio, acv.lpal_precio, acv.art_nombre,");
        sql.append("acv.art_costo_envio, acv.rub_codigo, acv.art_descr_comercial,");
        sql.append("acv.acw_palabras_claves, acv.mar_codigo, acv.mar_nombre,");
        sql.append("acv.caw_codigo, acv.caw_nombre, acv.caw_palabras_claves ");
        sql.append("FROM articulos_campanias_vista acv ");
        sql.append("WHERE acv.cam_codigo = ? ");
        sql.append(")");
        sql.append("WHERE art_codigo = ? ");
        sql.append("ORDER BY  rub_codigo");
        
        al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),NUMERIC));
        al.add(new BoundParam(++pos,articuloWeb.getArtCodigo(),VARCHAR));
        
        
        
        try {
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,al);
            rs.next();
            
            
            articuloCampania = new ArticuloCampania();
            articuloWeb = new ArticuloWeb();
            
            articuloCampania.setArcConsulta(Integer.valueOf(Utiles.noNull(rs.getObject(2),
                    "0")));
            articuloCampania.setArcPedido(Integer.valueOf(Utiles.noNull(rs.getObject(3),
                    "0")));
            articuloCampania.setArcPrecioDescuento(Float.parseFloat(Utiles.noNull(rs.getObject(4),
                    "0")));
            articuloCampania.setArcPrecioLista(Float.parseFloat(Utiles.noNull(rs.getObject(5),
                    "0")));
            articuloWeb.setArtCodigo(Utiles.noNull(rs.getObject(1)));
            articuloWeb.setArtNombre(Utiles.noNull(rs.getObject(6)));
            articuloWeb.setArtCostoEnvio(Float.parseFloat(Utiles.noNull(rs.getObject(7),
                    "0")));
            articuloWeb.setArtRubro(Utiles.noNull(rs.getObject(8)));
            articuloWeb.setArtDescripcion(Utiles.noNull(rs.getObject(9)));
            articuloWeb.setArwPalabrasClaves(Utiles.noNull(rs.getObject(10)));
            articuloWeb.setArtMarcaCodigo(new Marca(Utiles.noNull(rs.getObject("mar_codigo")),
                    Utiles.noNull(rs.getObject("mar_nombre"))));
            
            CategoriaWeb cat = new CategoriaWeb();
            cat.setCawCodigo(Utiles.noNull(rs.getObject("caw_codigo")));
            cat.setCawNombre(Utiles.noNull(rs.getObject("caw_nombre")));
            articuloWeb.setArwCategoria(cat);
            
            logger.info("Articulo: " + articuloWeb.getArtCodigo());
            articuloCampania.setArcArticulo(articuloWeb);
            
        } catch (SQLException e) {
            logger.info("No se eoncontro articulo con el codigo: " +
                    articuloWeb.getArtCodigo() + " y la campania: " +
                    campaniaWeb.getCamCodigo().toUpperCase());
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
            
        } finally {
            c.cerrarConexion();
        }
        
        return articuloCampania;
    }
        /**
     * Obtener el objeto ArticuloCampania a partir de un articulo y
     * una campania pasados por parametro
     * @param campaniaWeb CampaniaWeb (solo el codigo)
     * @param articuloWeb ArticuloWeb (solo el codigo)
     * @return ArticuloCampania
     */
    public static ArticuloCampania obtenerArticuloCampaniaAvw(CampaniaWeb campaniaWeb,
            ArticuloWeb articuloWeb) throws AvwException {
        ArticuloCampania articuloCampania;
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
        
        sql.append("SELECT art_codigo, art_nombre, art_es_mas_consultado, art_es_mas_pedido ");
        sql.append("FROM  articulos_avw ");
        sql.append("WHERE art_codigo = ? ");
        sql.append("AND cam_codigo = ? ");
        
        al.add(new BoundParam(++pos,articuloWeb.getArtCodigo(),VARCHAR));
        al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),NUMERIC));
        
        try {
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,al);
            rs.next();
            
            articuloCampania = new ArticuloCampania();
            articuloWeb = new ArticuloWeb();
            
            articuloWeb.setArtCodigo(Utiles.noNull(rs.getObject("art_codigo")));
            articuloWeb.setArtNombre(Utiles.noNull(rs.getObject("art_nombre")));
            
            articuloCampania.setArcArticulo(articuloWeb);
            int consultado = rs.getInt("art_es_mas_consultado");
            int pedido = rs.getInt("art_es_mas_pedido");
            boolean cons = false;
            if(consultado == 1){
                cons = true;
            }
            boolean pedid = false;
            if(pedido == 1){
                pedid = true;
            }
            articuloCampania.setArcEsMasConsultado(cons);
            articuloCampania.setArcEsMasPedido(pedid);
            logger.info("Articulo: " + articuloWeb.getArtCodigo());
            articuloCampania.setArcArticulo(articuloWeb);
            
        } catch (SQLException e) {
            logger.info("No se eoncontro articulo con el codigo: " +
                    articuloWeb.getArtCodigo() + " y la campania: " +
                    campaniaWeb.getCamCodigo().toUpperCase());
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
            
        } finally {
            c.cerrarConexion();
        }
        
        return articuloCampania;
    }
    
    /**
     * Obtener el objeto ArticuloCampania a partir de un articulo y
     * una campania pasados por parametro
     * @param campaniaWeb CampaniaWeb (solo el codigo)
     * @param articuloWeb ArticuloWeb (solo el codigo)
     * @return ArticuloCampania
     */
    public static ArticuloCampania obtenerArticuloCampaniaCarrito(CampaniaWeb campaniaWeb,
            ArticuloWeb articuloWeb) throws AvwException {
        ArticuloCampania articuloCampania;
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
        
        sql.append("SELECT acv.acw_consulta, acv.acw_pedido, acv.lpad_precio, acv.lpal_precio, ");
        sql.append("acv.art_codigo, acv.art_nombre, acv.art_costo_envio, acv.rub_codigo, ");
        sql.append("acv.art_descr_comercial, acv.acw_palabras_claves, acv.mar_codigo, acv.mar_nombre, ");
        sql.append("acv.lpad_precio_bruto, acv.lpal_precio_bruto, acv.art_costo_envio_bruto ");
        sql.append("FROM articulos_campanias_car_vista acv ");
        sql.append("WHERE ");
        sql.append("acv.art_codigo LIKE  ? ");
        sql.append("AND acv.cam_codigo LIKE ? ");
        
        al.add(new BoundParam(++pos,articuloWeb.getArtCodigo(),VARCHAR));
        al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),VARCHAR));
        
        
        
        try {
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,al);
            rs.next();
            
            
            articuloCampania = new ArticuloCampania();
            articuloWeb = new ArticuloWeb();
            
            articuloCampania.setArcConsulta(Integer.valueOf(Utiles.noNull(rs.getObject("acw_consulta"),
                    "0")));
            articuloCampania.setArcPedido(Integer.valueOf(Utiles.noNull(rs.getObject("acw_pedido"),
                    "0")));
            articuloCampania.setArcPrecioDescuento(Float.parseFloat(Utiles.noNull(rs.getObject("lpad_precio"),
                    "0")));
            articuloCampania.setArcPrecioLista(Float.parseFloat(Utiles.noNull(rs.getObject("lpal_precio"),
                    "0")));
            articuloCampania.setArcPrecioDescuentoBruto(Float.parseFloat(Utiles.noNull(rs.getObject("lpad_precio_bruto"),
                    "0")));
            articuloCampania.setArcPrecioListaBruto(Float.parseFloat(Utiles.noNull(rs.getObject("lpal_precio_bruto"),
                    "0")));
            
            articuloWeb.setArtCodigo(Utiles.noNull(rs.getObject("art_codigo")));
            articuloWeb.setArtNombre(Utiles.noNull(rs.getObject("art_nombre")));
            articuloWeb.setArtCostoEnvio(Float.parseFloat(Utiles.noNull(rs.getObject("art_costo_envio"),
                    "0")));
            articuloWeb.setArtCostoEnvioBruto(Float.parseFloat(Utiles.noNull(rs.getObject("art_costo_envio_bruto"),
                    "0")));
            articuloWeb.setArtRubro(Utiles.noNull(rs.getObject("rub_codigo")));
            articuloWeb.setArtDescripcion(Utiles.noNull(rs.getObject("art_descr_comercial")));
            articuloWeb.setArwPalabrasClaves(Utiles.noNull(rs.getObject("acw_palabras_claves")));
            articuloWeb.setArtMarcaCodigo(new Marca(Utiles.noNull(rs.getObject("mar_codigo")),
                    Utiles.noNull(rs.getObject("mar_nombre"))));
            logger.info("Articulo: " + articuloWeb.getArtCodigo());
            articuloCampania.setArcArticulo(articuloWeb);
            
        } catch (SQLException e) {
            logger.info("No se eoncontro articulo con el codigo: " +
                    articuloWeb.getArtCodigo() + " y la campa�a: " +
                    campaniaWeb.getCamCodigo().toUpperCase());
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
            
        } finally {
            c.cerrarConexion();
        }
        
        return articuloCampania;
    }
    
    /**
     * Obtener la categoria del articulo
     * @param articuloWeb ArticuloWeb (solo el codigo)
     * @return CategoriaWeb
     */
    public static CategoriaWeb obtenerCategoriaWebDeArticulo(ArticuloWeb articuloWeb) throws AvwException {
        CategoriaWeb categoriaWeb = null;
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
        
        sql.append("SELECT c.caw_codigo, c.caw_nombre, c.caw_categoria_padre, c.caw_palabras_claves ");
        sql.append("FROM articulos_categorias_web a, categorias_web c ");
        sql.append("WHERE a.caw_codigo = c.caw_codigo ");
        sql.append("AND a.art_codigo LIKE ?");
        al.add(new BoundParam(++pos, articuloWeb.getArtCodigo() ,VARCHAR));
        try {
            logger.info("Consulto la categoria de un articulo determinado");
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,al);
            rs.next();
            categoriaWeb = new CategoriaWeb();
            categoriaWeb.setCawCodigo(Utiles.noNull(rs.getString("caw_codigo")));
            categoriaWeb.setCawNombre(Utiles.noNull(rs.getObject("caw_nombre")));
            categoriaWeb.setCawPalabrasClaves(Utiles.noNull(rs.getObject("caw_palabras_claves")));
        } catch (SQLException e) {
            // logger.log(Level.SEVERE, e.getMessage(), e);
            // throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
        
        return categoriaWeb;
    }
    
    /**
     *
     * @param articuloWeb
     * @return CategoriaArticulo con su respectivo CategoriaRubro y el dato carValor
     * y de CategoriaRubro los datos cruCodigo y cruNombre
     * @throws AvwException
     */
    public static CategoriaArticulo obtenerCategoriaArticulo(ArticuloWeb articuloWeb) throws AvwException {
        
        CategoriaArticulo categoriaArticulo = new CategoriaArticulo();
        CategoriaRubro categoriaRubro = new CategoriaRubro();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos =0;
        sql.append("SELECT ca.car_valor, cr.cru_codigo, cr.cru_nombre ");
        sql.append("FROM categorias_articulos ca, categorias_rubros cr ");
        sql.append("WHERE ca.cru_codigo = cr.cru_codigo ");
        sql.append("AND ca.art_codigo LIKE ? ");
        al.add(new BoundParam(++pos,articuloWeb.getArtCodigo(),VARCHAR));
        
        try {
            logger.info("Consulto la categoria de un articulo determinado");
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,al);
            rs.next();
            categoriaArticulo.setCarValor(Utiles.noNull(rs.getObject(1)));
            categoriaRubro.setCruCodigo(Utiles.noNull(rs.getObject(2)));
            categoriaRubro.setCruNombre(Utiles.noNull(rs.getObject(3)));
            categoriaArticulo.setCarCategoriaRubro(categoriaRubro);
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
        return categoriaArticulo;
        
    }
    
    /**
     * Arraylist con su respectivo CategoriaRubro y el dato carValor
     * y de CategoriaRubro los datos cruCodigo y cruNombre
     * @param articuloWeb
     * @return ArrayList<CategoriaArticulo>.
     * @throws AvwException
     */
    public static ArrayList<CategoriaArticulo> obtenerCategoriasArticulo(ArticuloWeb articuloWeb) throws AvwException {
        ArrayList<CategoriaArticulo> categorias =
                new ArrayList<CategoriaArticulo>();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
        
        sql.append("SELECT cru_codigo,cru_nombre ,0 as imprimible,'' as valor  FROM categorias_rubros cru ,articulos_avw ");
        sql.append("WHERE  art_codigo = ? and cru.rub_codigo = ? ");
        sql.append("AND (art_codigo,cru_codigo) NOT IN (SELECT art_codigo,cru_codigo FROM categorias_articulos) ");
        sql.append("UNION ");
        sql.append("SELECT cru.cru_codigo,cru.cru_nombre,car.car_imprimible,car.car_valor as valor ");
        sql.append("FROM categorias_articulos car, categorias_rubros cru ");
        sql.append("WHERE cru.cru_codigo = car.cru_codigo ");
        sql.append("AND art_codigo = ? AND car.rub_codigo = ? ");
        sql.append("AND cru.rub_codigo = car.rub_codigo  ORDER BY 1");
        
        al.add(new BoundParam(++pos,articuloWeb.getArtCodigo(),VARCHAR));
        al.add(new BoundParam(++pos,articuloWeb.getArtRubro(),VARCHAR));
        al.add(new BoundParam(++pos,articuloWeb.getArtCodigo(),VARCHAR));
        al.add(new BoundParam(++pos,articuloWeb.getArtRubro(),VARCHAR));
        
        try {
            logger.info("Consulto la Categorias de un articulo determinado");
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,al);
            
            while (rs.next()) {
                CategoriaArticulo categoriaArticulo = new CategoriaArticulo();
                CategoriaRubro categoriaRubro = new CategoriaRubro();
                
                categoriaArticulo.setCarValor(Utiles.noNull(rs.getObject(4)));
                categoriaRubro.setCruCodigo(Utiles.noNull(rs.getObject(1)));
                categoriaRubro.setCruNombre(Utiles.noNull(rs.getObject(2)));
                
                categoriaArticulo.setCarCategoriaRubro(categoriaRubro);
                
                categorias.add(categoriaArticulo);
            }
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
        return categorias;
        
    }
    
    /**
     * XXX ESTA MAL EL EMPAREJAMIENTO XXX
     * Obtener la categoria rubro a partir de la categora articulo
     * pasada por parametro
     * @param categoriaArticulo CategoriaArticulo (con solo el campo cruCodigo)
     * @return CategoriaRubro
     */
    /*public static CategoriaRubro obtenerCategoriaRubroDeCategoriaArticulo(CategoriaArticulo categoriaArticulo) throws AvwException {
        CategoriaRubro categoriaRubro = null;
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos =0 ;
     
        sql.append("SELECT cru_codigo, cru_nombre ");
        sql.append("FROM categorias_rubros ");
        sql.append("WHERE cru_codigo = ? ");
     
        al.add(new BoundParam(++pos,categoriaArticulo.getCarCategoriaRubro().getCruCodigo(),NUMERIC));
     
        try {
            logger.info("Consulto un articulo con codigo determinado");
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,al);
     
            rs.next();
            categoriaRubro.setCruCodigo(Utiles.noNull(rs.getObject("cru_codigo")));
            categoriaRubro.setCruNombre(Utiles.noNull(rs.getObject("cru_nombre")));
     
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
     
        } finally {
            c.cerrarConexion();
        }
     
        return categoriaRubro;
    }*/
    
    /**
     * Actualizar los campos de consulta y pedido del ArticuloCampania
     * @param articuloCampania ArticuloCampania (con solo los atributos
     * "consulta" y "pedido".
     * @param CampaniaWeb campaniaWeb.
     */
    public static void modificarArticuloCampania(ArticuloCampania articuloCampania,
            CampaniaWeb campaniaWeb) throws AvwException {
        StringBuilder sql = new StringBuilder();
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos =0 ;
        
        sql.append("UPDATE ");
        sql.append("articulos_avw ");
        sql.append("SET ");
        sql.append("acw_consulta = ? ");
        sql.append(", acw_pedido = ? ");
        sql.append(" WHERE art_codigo LIKE ? ");
        sql.append(" AND cam_codigo LIKE ? ");
        
        al.add(new BoundParam(++pos,articuloCampania.getArcConsulta(),NUMERIC));
        al.add(new BoundParam(++pos,articuloCampania.getArcPedido(),NUMERIC));
        al.add(new BoundParam(++pos,articuloCampania.getArcArticulo().getArtCodigo(),VARCHAR));
        al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),VARCHAR));
        try {
            logger.info("UPDATE atributos consulta y pedido de un articuloCampania");
            c.abrirConexion();
            c.executePreparedStatement(sql,al);
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
    }
    
      /**
     * Actualizar el destacado enviado por parametro
     * @param destacadoWeb DestacadoWeb (con todos los atributos)
     **/
    public static void modificarDestacado(DestacadoWeb destacadoWeb, 
            ArticuloWeb articuloWeb, CampaniaWeb campaniaWeb) throws AvwException {
        StringBuilder sql = new StringBuilder();
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos =0 ;
        //Actualizo destacadoWeb
        sql.append("UPDATE ");
        sql.append("destacados_web ");
        sql.append("SET ");
        sql.append("des_titulo = ? ");
        sql.append(", des_descripcion = ? ");
        sql.append(", des_mostrar_precio = ? ");
        sql.append(" WHERE art_codigo = ? ");
        sql.append(" AND cam_codigo = ? ");
        
        
        al.add(new BoundParam(++pos,destacadoWeb.getDesTitulo(),VARCHAR, true));
        al.add(new BoundParam(++pos,destacadoWeb.getDesDescripcion(),VARCHAR, true));
        al.add(new BoundParam(++pos,destacadoWeb.getDesMostrarPrecio(),NUMERIC, true));
        al.add(new BoundParam(++pos,articuloWeb.getArtCodigo(),VARCHAR, true));
        al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),VARCHAR, true));
        try {
            logger.info("UPDATE atributos consulta y pedido de un articuloCampania");
            c.abrirConexion();
            c.executePreparedStatement(sql,al);
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
    }
    
    /**
     * Obtener las categorias relacionadas a la categoria del
     * articulo pasado por parametro
     * @param articuloWeb ArticuloWeb (con solo el codigo)
     * @return ArrayList de objetos CategoriaWeb
     */
    public static ArrayList<CategoriaWeb> obtenerCategoriasRelacionadasDeArticulo(ArticuloWeb articuloWeb) throws AvwException {
        ArrayList<CategoriaWeb> categorias = new ArrayList<CategoriaWeb>();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0 ;
        
        sql.append("SELECT cw.caw_codigo,cw.caw_nombre,cw.caw_categoria_padre,cw.caw_palabras_claves ");
        sql.append("FROM categorias_web cw, relacion_categorias_web rcw ");
        sql.append("WHERE cw.caw_codigo = rcw.caw_codigo_padre ");
        sql.append("AND cw.caw_codigo = ? ");
        
        al.add(new BoundParam(++pos,articuloWeb.getArwCategoria().getCawCodigo(),NUMERIC));
        
        try {
            logger.info("Consulto Categorias relacionadas ");
            c.abrirConexion();
            
            rs = c.getPreparedStatementResultSet(sql,al);
            
            while (rs.next()) {
                CategoriaWeb categoria = new CategoriaWeb();
                categoria.setCawCodigo(Utiles.noNull(rs.getString("caw_codigo")));
                categoria.setCawNombre(Utiles.noNull(rs.getString("caw_nombre")));
                categoria.setCawCategoriaPadre(new CategoriaWeb(Utiles.noNull(rs.getString("caw_categoria_padre"))));
                categoria.setCawPalabrasClaves(Utiles.noNull(rs.getString("caw_palabras_claves")));
                
                categorias.add(categoria);
            }
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
        
        return categorias;
    }
    
    /**
     * Verificar exitencia del articulo
     * @param articuloWeb ArticuloWeb (con
     * el objeto CategoriaWeb y las palabras claves)
     */
    public static boolean verificarExistencia(ArticuloWeb articuloWeb) throws AvwException {
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
        boolean res = false;
        
        try {
            sql.append("SELECT art_codigo, caw_codigo ");
            sql.append("FROM articulos_categorias_web ");
            sql.append("WHERE ");
            sql.append("art_codigo = ? ");
            
            al.add(new BoundParam(++pos,articuloWeb.getArtCodigo(),VARCHAR));
            
            logger.info("SELECT Articulo");
            logger.info(sql.toString());
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,al);
            
            if (rs.next()){
                res = true;
            }
            
        } catch (Exception e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
        return res;
    }
    
    /**
     * Insertar articulo categoria
     * @param articuloWeb ArticuloWeb (con
     * el objeto CategoriaWeb y las palabras claves)
     */
    public static void insertarArticuloCategoria(ArticuloWeb articuloWeb) throws AvwException {
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
        boolean res = false;
        
        try {
            
            sql.append("INSERT INTO articulos_categorias_web ");
            sql.append("VALUES ");
            sql.append("(?,?,?) ");
            
            al.add(new BoundParam(++pos,articuloWeb.getArtCodigo(),VARCHAR));
            al.add(new BoundParam(++pos,articuloWeb.getArwCategoria().getCawCodigo(),VARCHAR));
            al.add(new BoundParam(++pos,articuloWeb.getArwPalabrasClaves(),VARCHAR));
            
            c.abrirConexion();
            logger.info("INSERT articulos_categorias_web");
            logger.info(sql.toString());
            c.executePreparedStatement(sql,al);
            
        } catch (Exception e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        } finally {
            c.cerrarConexion();
        }
    }
    
    /**
     * Obtiene un ArrayList de los articulos existentes segun la campania, la
     * categoria y el filtro indicado.
     * opcion =
     *                 0.- Codigo o Nombre de articulo
     *                 1.- Codigo articulo
     *                 2.- Nombre articulo
     *                 3.- Descripcion comercial
     *                 4.- Nombre marca
     *                 5.- Nombre categoria
     * filtro = valor a buscar.
     * Por cada articulo retorna tambien la cantidad de fotos y documentos.
     * @return Retorna los articulos a partir de la tabla de etercor y
     *          la de este sistema. Si el articulo no esta en las tablas del
     *          sistema, se debe retornar igual sin los datos correspondientes
     *          a la tabla del sistema.
     */
    public static ArrayList<ArticuloWeb> listarArticulosFiltro(int opcion, String filtro, CampaniaWeb campaniaWeb, CategoriaWeb categoriaWeb) throws AvwException {
        ArrayList<ArticuloWeb> articulosWeb = new ArrayList<ArticuloWeb>();
        StringBuilder sql = new StringBuilder();
        ResultSet rs;
        ConexionAvw c = new ConexionAvw();
        ArrayList al = new ArrayList();
        int pos=0;
        
        sql.append("SELECT art.art_codigo, art.art_nombre, cw.caw_codigo, cw.caw_nombre  ");
        sql.append("FROM articulos_categorias_web acw, articulos_avw art, categorias_web cw ");
        sql.append("WHERE acw.art_codigo = art.art_codigo ");
        sql.append("AND cw.caw_codigo = acw.caw_codigo ");
        sql.append("AND art.cam_codigo = ? ");
        String hojas = "";
        if (!categoriaWeb.getCawCodigo().equals("-1")){
            hojas = CategoriaDAL.obtenerCategoriasHojasPorCategoriaWeb(
                    categoriaWeb.getCawCodigo());
            hojas =  hojas.substring(0, (hojas.length() - 1));
            sql.append("AND cw.caw_codigo IN ( ");
            sql.append(hojas);
            sql.append(") ");
            
        }
        
        switch (opcion) {
            case 0:
                sql.append("AND (art.art_codigo LIKE '%");
                sql.append(filtro.toUpperCase());
                sql.append("%'");
                sql.append("OR art.art_nombre LIKE '%");
                sql.append(filtro.toUpperCase());
                sql.append("%')");
                break;
            case 1:
                sql.append("AND art.art_codigo LIKE '%");
                sql.append(filtro.toUpperCase());
                sql.append("%'");
                break;
            case 2:
                sql.append("AND art.art_nombre LIKE '%");
                sql.append(filtro.toUpperCase());
                sql.append("%'");
                break;
            case 3:
                sql.append("AND art.mar_nombre LIKE '%");
                sql.append(filtro.toUpperCase());
                sql.append("%'");
                break;
            case 4:
                sql.append("AND art.mar_nombre LIKE '%");
                sql.append(filtro.toUpperCase());
                sql.append("%'");
                break;
            default:
                break;
        }
        sql.append("ORDER BY art.art_nombre ");
        
        try {
            al.add(new BoundParam(++pos,campaniaWeb.getCamCodigo(),NUMERIC));
            
            logger.info("Listo los articulos con la consula");
            logger.info(sql.toString());
            c.abrirConexion();
            rs = c.getPreparedStatementResultSet(sql,al);
            
            while (rs.next()) {
                /* Crea un articulo */
                ArticuloWeb articulo = new ArticuloWeb();
                articulo.setArtCodigo(Utiles.noNull(rs.getObject("art_codigo")));
                articulo.setArtNombre(Utiles.noNull(rs.getObject("art_nombre")));
                
                CategoriaWeb categoria = new CategoriaWeb();
                // se coloca -1 para evitar el buble infinito al hacer getCaw
                categoria.setCawCodigo("-1");
                categoria.setCawNombre("");
                if (!Utiles.noNull(rs.getObject("caw_codigo")).equals("")){
                    categoria.setCawCodigo(Utiles.noNull(rs.getObject("caw_codigo")));
                    categoria.setCawNombre(Utiles.noNull(rs.getObject("caw_nombre")));
                }
                articulo.setArwCategoria(categoria);
                
                articulosWeb.add(articulo);
            }   // fin while
        } catch (SQLException e) {
            logger.log(Level.SEVERE, e.getMessage(), e);
            throw new AvwException(e);
        }finally{
            c.cerrarConexion();
        }
        
        return articulosWeb;
    }
}
